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

问题描述 投票:2回答:3

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

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

.net interop pinvoke cpu-architecture
3个回答
0
投票

我将p / invoke代码放入一个单独的程序集(一个用于32和一个用于64位),然后qazxsw poi取决于平台。

有许多方法可以确定系统的类型。 load the appropriate one at run time


1
投票

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

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.