首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在运行时延迟绑定32位/64位库

如何在运行时延迟绑定32位/64位库
EN

Stack Overflow用户
提问于 2008-08-22 13:23:16
回答 3查看 4.2K关注 0票数 17

我遇到了一个类似于描述here (加载程序集及其依赖项)的问题,但与之略有不同。

我有一个用于3D渲染的C++动态链接库,这是我们卖给客户的。对于.NET用户,我们将对其使用CLR包装器。CLR可以在32位和64位版本中构建,但我认为这意味着我们需要两个C++包装器,因为它绑定到一个特定的DLL?

假设我们的客户有一个32位或64位的.NET应用程序,并且它是一个纯.NET应用程序,它让CLR从一组程序集中解决它。问题是,应用程序代码如何在运行时动态选择我们的32位和64位CLR/DLL组合?

更具体地说,对上述问题的建议答案是否也适用于这里(即创建ResolveEvent处理程序)?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-01-26 12:42:19

对于这个问题,我终于有了一个似乎可行的答案。

将32位和64位版本-托管和非托管-编译到单独的文件夹中。然后让.NET应用程序在运行时选择要从哪个目录加载程序集。

使用ResolveEvent的问题是,只有在没有找到程序集的情况下才会调用它,因此很容易意外地以32位版本结束。取而代之的是使用第二个AppDomain对象,我们可以在其中更改ApplicationBase属性以指向正确的文件夹。所以你最终会得到类似这样的代码:

代码语言:javascript
复制
static void Main(String[] argv)
  {
     // Create a new AppDomain, but with the base directory set to either the 32-bit or 64-bit
     // sub-directories.

     AppDomainSetup objADS = new AppDomainSetup();

     System.String assemblyDir = System.IO.Path.GetDirectoryName(Application.ExecutablePath);
     switch (System.IntPtr.Size)
     {
        case (4): assemblyDir += "\\win32\\";
           break;
        case (8): assemblyDir += "\\x64\\";
           break;
     }

     objADS.ApplicationBase = assemblyDir;

     // We set the PrivateBinPath to the application directory, so that we can still
     // load the platform neutral assemblies from the app directory.
     objADS.PrivateBinPath = System.IO.Path.GetDirectoryName(Application.ExecutablePath);

     AppDomain objAD = AppDomain.CreateDomain("", null, objADS);
     if (argv.Length > 0)
        objAD.ExecuteAssembly(argv[0]);
     else
        objAD.ExecuteAssembly("MyApplication.exe");

     AppDomain.Unload(objAD);

  }

你最终得到了两个exes你的普通应用程序和另一个选择加载哪些位的切换应用程序。注意--我不能把这个细节归功于我自己。我的一位同事根据我最初的观点发现了这一点。如果他在StackOverflow上签了名,我会把答案交给他

票数 8
EN

Stack Overflow用户

发布于 2008-08-22 13:53:13

大约一年前,我能够做到这一点,但我不再记得所有的细节。基本上,您可以使用IntPtr.Size来确定要加载哪个DLL,然后通过p/ LoadLibrary执行实际的调用。在这一点上,您已经在内存中获得了模块,并且应该能够从它内部只执行p/Invoke函数--相同的模块名称不应该再次被重新加载。

不过,我认为在我的应用程序中,我实际上让Invoking DLL将自己注册为COM服务器,然后通过生成的.NET包装器访问它的功能--所以我不知道我是否曾经直接测试过p/ C++。

票数 3
EN

Stack Overflow用户

发布于 2008-08-22 13:30:52

不久前我也遇到过类似的情况。我使用的一个工具包在64位环境中表现不佳,并且我无法找到一种动态强制程序集绑定为32位的方法。

可以强制你的程序集在32位模式下工作,但这需要修补CLR头(Framework中有一个工具可以做到这一点),如果你的程序集是强命名的,这是行不通的。

恐怕您需要为32位和64位平台构建和发布两组二进制文件。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22322

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档