.NET应用程序加载混合dll,使用任何CPU。

5

我刚开始接触创建.NET应用程序,尤其是混合应用程序。

最近,我为客户创建了一组(静态)库,使用(非托管)C++编写(在MS Visual Studio 2010下),支持32位和64位编译,这些库被一些应用程序加载,并且通常情况下都很好。 (在内部,此功能使用各种其他第三方库,如OpenGL,boost,glm等)

现在,他希望还能够在他的C#应用程序中使用我提供的某些功能作为自定义控件。

因此,我使用C++/CLI创建具有CLR支持的dll,创建了包装器类来包装我的功能,然后创建了一个公共的WPF控件(因此可以从外部访问),同样可以在32位和64位中构建。

然后进行测试,我创建了一个简单的C#应用程序(实际上非常简单,因为我是新手,我的背景是C/C++),可以在32位或64位上成功地从我的DLL加载控件并执行预期的操作。

现在我的问题是,他说他想只分发一个“任意CPU”的可执行文件,该文件应根据启动位置的不同加载适当的代码(即32位或64位)。

所以我添加了一个“任意CPU”配置到C#测试项目中,并在“生成”选项卡下将“平台目标”设置为“任意CPU”。但是,我不确定在“配置管理器”下,其他项目(即由C++/CLI混合模式dll使用的C++静态库)的平台该设置为何种类型。因此,为了测试,我将其设置为x64,但是当我构建它时,会收到警告:

Warning MSB3270: There was a mismatch between the processor architecture of the project being built "MSIL" and the processor architecture of the reference "(name of my 64 bit dll)", "AMD64".  <br /> 
This mismatch may cause runtime failures. Please consider changing the targeted processor architecture of your project through the Configuration Manager so as to align the processor architectures between your project and references, or take a dependency on references with a processor architecture that matches the targeted processor architecture of your project.

运行正常,但是还是会弹出警告。当我把其他项目设置为“Win32”时,只需将“x86”提及即可得到相同的警告,但在这种情况下,它会在启动时抛出异常,显示“在PresentationCore.dll中发生了未处理的类型'System.BadImageFormatException'异常”。

那么我需要将其更改为什么呢?如何使其加载可执行文件,然后再决定加载哪个dll?我真的不知道该怎么做才能按要求使其正常工作。


https://www.youtube.com/watch?v=7qnd-hdmgfk - Hans Passant
1个回答

2
在一篇有关使用Perforce库的文章中,我找到了解决问题的方法: http://scottbilas.com/blog/automatically-choose-32-or-64-bit-mixed-mode-dlls/ 实质上,您需要创建一个代理dll,该dll是输出目标,并用作托管C#(在我的情况下是WPF)应用程序的引用。
然后,您需要创建x64和x86版本的dll,并将其与可执行文件一起提供。您必须确保代理dll不存在于可执行文件旁边。
启动时,您需要为AppDomain.CurrentDomain.AssemblyResolve创建事件处理程序,当它无法找到代理dll时将被触发。
然后,根据您是否处于32位或64位环境中,它可以选择正确的dll并加载它。

感谢您记录下您的发现。然而,这篇文章过于笼统。详细、逐步解释您实际所做的事情,并提供真实(或接近真实)的示例将会很有用。 - Mike Nakis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接