C# 为混合平台(32,64)编译并引用运行时解析的32或64位DLL

C# 为混合平台(32,64)编译并引用运行时解析的32或64位DLL,c#,c++,dll,C#,C++,Dll,在windows 32或64位下使用VS2010。 我们的C#应用程序调用第三方DLL(托管),该DLL与非托管DLL接口。 第三方DLL API在32位或64位中显示相同,但其下面链接到32位或64位非托管DLL 我们希望我们的C#应用程序可以在32位或64位操作系统上运行,理想情况下,它会自动检测操作系统并加载适当的第32方DLL—通过一个简单的工厂类来测试环境。因此,最简单的解决方案是运行时文件夹,其中包含: OurApp.exe 3rdParty32.DLL 3rdPartyUnmana

在windows 32或64位下使用VS2010。 我们的C#应用程序调用第三方DLL(托管),该DLL与非托管DLL接口。 第三方DLL API在32位或64位中显示相同,但其下面链接到32位或64位非托管DLL

我们希望我们的C#应用程序可以在32位或64位操作系统上运行,理想情况下,它会自动检测操作系统并加载适当的第32方DLL—通过一个简单的工厂类来测试环境。因此,最简单的解决方案是运行时文件夹,其中包含: OurApp.exe 3rdParty32.DLL 3rdPartyUnmanaged32.DLL 3rdParty64.DLL 3rdPartyUnmanaged64.DLL

但是,托管第三方32和64 dll的接口是相同的,因此无法在同一VS2010项目中引用这两个dll:添加第二个dll时,会显示警告三角形,并且不会被引用

我唯一的答案是创建两个额外的库DLL项目来引用第三方32和64 DLL吗?因此,我将以以下项目安排结束: 项目1:生成OurApp.exe,为project2或project3动态创建对象。 项目2:构建引用3rdParty32.DLL的OurApp32.DLL
项目3:构建我们的App64.DLL,它引用3rdParty64.DLL

我不能说我以前做过这件事,但快速搜索告诉我,您可以根据接口编程,并通过反射动态加载库


您考虑过这一点吗?

这里有一个想法,可以通过自定义构建过程来实现:

让您的项目编译两次到YourApp32.exe和YourApp64.exe,并适当修改引用。然后用引导程序YourApp.exe创建第三个项目,它只会检查系统的位,并加载YourApp32.exe或YourApp64.exe


当然,这可能只适用于发布版本,因为编译时间实际上增加了一倍,这会让开发人员感到恼火。

一个选项是在工厂中使用反射在运行时加载正确的第三方程序集,并创建适当类的实例,并返回对它的引用。然后,您可以将程序集放在与可执行文件相同的目录中,并在运行时加载适当的程序集,而无需添加项目引用。但是,通常这会使用已知的基本抽象类或来自另一个程序集的接口(通常是专门用于保存所需声明的程序集)。听起来你没有这个

但是,根据第三方管理的DLL的类型层次结构的复杂性,可能会有一个选项沿此路线,需要稍微多做一些工作

  • 在您自己的项目中创建一组类,以镜像第三方dll的结构。假设第三方库不太复杂,这可能只是一个包含许多方法的类。您还必须重新创建任何来回传递的结构(如果有的话)
  • 创建一组与dll中要调用的方法的签名匹配的委托。例如,像:
    stringdofoo(inta,intb)
    这样的方法将有一个类似于
    delegate stringdofoodegate(inta,intb)
    的委托。如果方法具有相同的签名,则可以对所有这些方法使用单个委托。添加到在第三方DLL中要调用的每个方法的变量之前创建的类集合中。因此,您的类将具有一组成员,这些成员的行是
    private-doFoo-delegate-doFoo。然后可以是您认为合适的任何访问级别
  • 对于最繁琐的部分(尽管您可能可以使用泛型函数来帮助完成大部分操作)。以此为指导,创建包装类的实例,将第三方库中的每个方法连接到类中匹配的成员。这应该在你的工厂内完成。完成后,返回新实例。然后,您应该能够通过包装器类调用第三方程序集

  • 这是一种非常粗糙的方法。如果您有选择权,请联系提供DLL的第三方,看看是否可以说服他们将匹配两个DLL的抽象类或接口公开到第三个程序集中,然后您可以引用这些抽象类或接口,而无需与委托进行任何纠结。

    因为您有32位或64位特定的非托管代码,您将失去托管代码在运行时能够JIT到任一模式的优势。可能最简单的方法是将make文件设置为两次构建应用程序,一次用于64位,一次用于32位,并使用csproj文件中的条件节引用32位或64位非托管DLL。让安装程序按照安装时找到的方式安装适合平台的二进制文件。

    +1为简单常识解决方案。逻辑上不同的架构应该有不同的构建。目标机器的操作系统不会从32位神奇地变为64位,你的软件也不会。让安装程序决定需要部署什么,这就是安装的目的。