【问题标题】:32 bit unmanaged dll in 64 bit wrapper64 位包装器中的 32 位非托管 dll
【发布时间】:2020-08-30 14:33:38
【问题描述】:

我正在创建一个从加载 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 是什么导致了问题?

更新

当我看到 LagacyWrapper 的源代码时,使用System.Runtime.Serialization.IFormatter 看到下面的序列化和反序列化

public void SendCallRequest(CallData callData)
{
    _formatter.Serialize(_pipe, callData);
}

public CallResult ReceiveCallResponse()
{
    CallResult callResult = (CallResult)_formatter.Deserialize(_pipe);

    if (callResult.Exception != null)
    {
        throw callResult.Exception;
    }

    return callResult;
}

【问题讨论】:

    标签: c# wrapper 32bit-64bit dllimport


    【解决方案1】:

    我对 LegacyWrapper 不是很熟悉,所以这是基于猜想。

    来自介绍 Legacy 包装器的博文:

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

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

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

    【讨论】:

    • 嗨 JonasH 我深入研究了源代码,发现这些行正在发送和接收消息。请查看更新后的帖子
    • 代码没有提供太多信息。如果 CallResult 只包含一个指针,那么格式化程序只会序列化指针值,而不是您想要的实际指向的对象。您仍然需要编组指向托管结构的指针,以便正确序列化对象。
    • 说实话我不知道。你有任何代码示例或文章要分享给我
    • 对不起,没有。我们使用类似的解决方案在 64 位进程中访问 32 位库,即将其移至单独的进程。但是我们自己做了,没有图书馆的帮助。我不确定是否可以自动编组指针,我能找到的大多数示例都是手动完成的。一种解决方法可能是创建一个包装器项目,该项目调用任何本机方法并将结果复制到简单、易于序列化的 .net 对象。
    猜你喜欢
    • 2011-01-05
    • 2010-11-03
    • 1970-01-01
    • 2017-04-01
    • 2011-12-22
    • 2015-08-19
    • 2011-02-28
    • 1970-01-01
    相关资源
    最近更新 更多