我遇到的问题与此处描述的类似,但略有不同(加载程序集及其依赖项)。

我有一个用于3D渲染的C ++ DLL,这是我们向客户销售的产品。 对于.NET用户,我们将有一个CLR包装器。 C ++ DLL可以在32位和64位版本中构建,但我认为这意味着我们需要有两个CLR包装器,因为CLR绑定到特定的DLL?

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

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

===============>>#1 票数:8 已采纳

我终于得到了一个似乎有效的答案。

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

使用ResolveEvent的问题在于,只有在找不到程序集时才会调用它,因此很容易意外地以32位版本结束。 而是使用第二个AppDomain对象,我们可以将ApplicationBase属性更改为指向正确的文件夹。 所以你最终得到的代码如下:

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);

  }

最终得到2个exes - 您的普通应用程序和第二个切换应用程序,用于选择要加载的位。 注意 - 我自己也不能相信这个细节。 我的一位同事怀疑我的初始指针。 如果他注册StackOverflow,我会给他答案

===============>>#2 票数:3

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

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

===============>>#3 票数:1

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

可以强制程序集在32位模式下工作,但这需要修补CLR头(有一个工具在框架中执行此操作),如果程序集具有强名称,则无法解决问题。

我担心你需要为32位和64位平台构建和发布两组二进制文件。

  ask by Greg Whitfield translate from so

未解决问题?本站智能推荐:

6回复

在64位计算机上运行32位C#应用程序

如何强制我的应用程序在64位计算机上以32位运行? 代码是用C#编写的。
1回复

生成英特尔兼容的x64位dll(C#)

我需要创建一个以x64位编译且与Intel兼容的简单dll。 当前,我使用VS 2013,我选择了(发布,x64),生成的dll是AMD64。 有没有机会能够为64位dll配置dll处理器体系结构兼容性?
1回复

为什么'Any CPU'应用程序在x64机器上作为x86运行?

我有一个Any CPU应用程序安装到Program Files(x86)。 在一台Windows 7 x64计算机上,它按预期运行x64,而在另一台Windows 7 x64计算机上运行为x86! 怎么会这样? 我希望它在两台机器上以x64运行。 可能是什么原因,我该怎样做才能始终以
1回复

x64 CLR的好处

我脑海中的一个小小的过早的优化错误告诉我,由于x64依赖的非托管DLL的x64版本,我应该将现有的x86 C#应用程序移植到x64。 我知道答案可能是这样做,测试并看看会发生什么,但是我想看看通常期望得到什么好处。 我发现两到四年前有很多帖子抱怨x64 CLR的速度比x86 CLR慢。
11回复

如何查找本机DLL文件是否编译为x64或x86?

我想确定本机程序集是否从托管代码应用程序( C# )编译为x64或x86。 我认为它必须在PE头中的某处,因为OS加载器需要知道这些信息,但我找不到它。 当然我更喜欢在托管代码中执行它,但如果有必要,我可以使用本机C ++。
1回复

在32位CPU上实现Int64

我有好奇心的问题。 如何为32位处理器实现Int64 ? 我可以看到三种选择 32位处理器具有允许64位算术的某种扩展 Int64完全在CLR中实现,它通过使用32位操作实现64位算术 一些 32位处理器可以进行64位运算,CLR使用这种逻辑。 在其他处理器上
2回复

我可以在Windows上将32位DLL加载到64位进程中吗?

我最近升级了ac #windows服务,以64位.net进程运行。 通常,这将是微不足道的,但系统使用了用C ++编写的32位DLL。 它不能将此DLL转换为64位,因此我将DLL封装在一个单独的32位.net进程中,并通过远程处理暴露了.net接口。 这是一个非常可靠的解决方案,但我
8回复

在同一解决方案/项目中使用Visual Studio定位32位和64位

关于如何为多目标设置我的visual studio构建,我有点困惑。 背景:c#.NET v2.0,带有p /调用第三方32位DLL,SQL compact v3.5 SP1,带有安装项目。 现在,平台目标设置为x86,因此可以在Windows x64上运行。 第三方公司刚刚发布了
5回复

为32位和64位非托管DLL创建托管包装器

我们正在围绕非托管DLL创建一个C#包装器。 非托管DLL有32和64位版本。 我们将托管包装器保留在自己的项目中,以便我们可以将其构建为单独的组件并在整个解决方案中重用它。 然而,这会导致一些问题。 由于非托管DLL对于32位和64位版本具有相同的名称,因此我们无法将正确的非托管D
1回复

在64位计算机上运行x86编译的代码时,单精度算术被破坏

当您在System.Single上阅读MSDN时 : Single符合IEC 60559:1989(IEEE 754)二进制浮点运算标准。 和C#语言规范: float和double类型使用32位单精度和64位双精度IEEE 754格式表示[...] 然后: