如何根据CPU架构使用正确的非托管.dll?

时间:2010-10-02 10:42:50

标签: .net interop pinvoke cpu-architecture

我在.net应用程序中使用非托管库,该应用程序在x86和64位系统上使用,因此编译为“任何CPU”。然而,非托管的原生.dll有两个不同的.dll(一个用于win32,一个用于x64)。

是否有任何方法可以保持'任何CPU'/一种二进制方式与不同的本机.dll关于x86&的P / Invoke签名64位系统?或者 - 是创建单独配置的唯一方法。因此发行?如果是这样,我可以使用任何编译#if /#endif标志吗?

3 个答案:

答案 0 :(得分:1)

在您的bin文件夹中,您可以添加另外两个名为x86x64的文件夹。这些文件夹将包含本机DLL的x64和x86映像 在启动时(在应用程序加载任何外部DLL之前),您可以modify process's PATH环境变量,因此它将根据进程的位数包含相应的子目录({{1应该表明你的位数。)

对于托管DLL探测,您可以订阅AppDomain.AssemblyResolve事件,因此您可以自己从正确的子目录加载程序集(例如,使用Assembly.Load)。

答案 1 :(得分:0)

我会将p / invoke代码放入一个单独的程序集(一个用于32个,一个用于64位),然后load the appropriate one at run time,具体取决于平台。

有很多方法可以确定系统的类型。 Lots are documented here

答案 2 :(得分:0)

您可以手动拨打LoadLbrary& GetProcAddress,通过调用Marshal.GetDelegateForFunctionPointer(procAddress, delegateType)将函数指针转换为委托。这会产生更多代码,但允许您将所有互操作代码保存在单个程序集中。例如,NHanspell使用这种方法。