[64位包装器中的32位非托管dll

问题描述 投票:0回答:1

我正在通过加载32位非托管dll创建包装器,以在64位环境中执行。所以我的方法是用这个LegacyWrapper

[LegacyDllImport("ste.dll")]
public interface INativeMethods : IDisposable
{
    [LegacyDllMethod(CallingConvention = CallingConvention.Winapi)]
    IIntPtr ste_init_with_environment_info(string dirLocation, string language);
}

我正在按如下方式调用此方法

public IWrapperConfig Configuration
{
    get
    {
        return _configuration ??= WrapperConfigBuilder.Create().TargetArchitecture(TargetArchitecture.X86).Build();
    }
}


using var client = WrapperProxyFactory<INativeMethods>.GetInstance(Configuration);
_steHandle = client.ste_init_with_environment_info(steHomeDirectory, SystemProperties());

似乎毫无例外,但是。结果,当我调用该函数时,我得到了0x0000000000000000,它应该类似于0x0186ad58引起问题的原因?

c# wrapper 32bit-64bit dllimport legacywrapper
1个回答
0
投票

我对LegacyWrapper不太熟悉,所以这是基于推测。

摘自介绍传统包装器的博客文章:

由于我们无法将32位代码加载到64位进程中,所以我们的想法是为此任务创建一个单独的可执行文件。它将以某种方式加载库,调用特定函数并将结果传递回调用方。

由于您的库在另一个进程中运行,因此返回指向内存的指针可能无法工作。据我所知,没有一种通用方法可以知道指针指向多少有效内存,那么包装器将如何知道要复制多少内存?对于某些特殊情况,这可能是可以解决的,但是我找不到有关序列化过程详细信息的任何文档。

您可能可以将指针定义为marshalled to a structure。否则,您可能想在legacyWrapper项目页面上发布问题,以澄清文档(如果没有其他内容)。

© www.soinside.com 2019 - 2024. All rights reserved.