我在.net应用程序中使用非托管库,该应用程序在x86和64位系统上使用,因此编译为“任何CPU”。然而,非托管的原生.dll有两个不同的.dll(一个用于win32,一个用于x64)。
是否有任何方法可以保持'任何CPU'/一种二进制方式与不同的本机.dll关于x86&的P / Invoke签名64位系统?或者 - 是创建单独配置的唯一方法。因此发行?如果是这样,我可以使用任何编译#if /#endif标志吗?
答案 0 :(得分:1)
在您的bin文件夹中,您可以添加另外两个名为x86
和x64
的文件夹。这些文件夹将包含本机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使用这种方法。