我在.net应用程序中使用非托管库,该应用程序在x86和64位系统上使用,因此编译为“任何CPU”。然而,非托管的本机.dll有两个不同的.dll(一个用于win32,一个用于x64)。
有没有办法仍然保持'任何CPU'/一个二进制方式与不同的本机.dll关于x86和64位系统的P / Invoke签名?或者 - 是创建单独配置和分发的唯一方法吗?如果是这样,我可以使用任何编译#if /#endif标志吗?
我将p / invoke代码放入一个单独的程序集(一个用于32和一个用于64位),然后qazxsw poi取决于平台。
有许多方法可以确定系统的类型。 load the appropriate one at run time。
在bin文件夹中,您可以添加另外两个名为Lots are documented here和x86
的文件夹。这些文件夹将包含本机DLL的x64和x86映像。
在启动时(在您的应用程序加载任何外部DLL之前),您可以x64
您的modify process's环境变量,因此它将根据进程的位数包含相应的子目录(PATH
应指示您的位数)。
对于托管DLL探测,您可以订阅IntPtr.Size
事件,因此您可以自己从正确的子目录加载程序集(例如,使用AppDomain.AssemblyResolve)。
你可以手动调用Assembly.Load和LoadLbrary
,通过调用GetProcAddress
将函数指针转换为委托。这会产生更多代码,但允许您将所有互操作代码保存在单个程序集中。例如,NHanspell使用这种方法。