这是情况,我在我的dot.net应用程序中使用基于C的dll.有2个dll,一个是32位称为MyDll32.dll,另一个是64位版本,名为MyDll64.dll.
有一个保存DLL文件名的静态变量:string DLL_FILE_NAME.
它以下列方式使用:
[DllImport(DLL_FILE_NAME, CallingConvention=CallingConvention.Cdecl, EntryPoint=Func1")]
private static extern int is_Func1(int var1, int var2);
Run Code Online (Sandbox Code Playgroud)
到目前为止简单.
可以想象,该软件是在打开"Any CPU"的情况下编译的.
我还有以下代码来确定系统是否应该使用64位文件或32位文件.
#if WIN64
public const string DLL_FILE_NAME = "MyDll64.dll";
#else
public const string DLL_FILE_NAME = "MyDll32.dll";
#endif
Run Code Online (Sandbox Code Playgroud)
到目前为止,您应该看到问题.. DLL_FILE_NAME是在编译时定义的,而不是在执行时间中定义的,因此根据执行上下文不会加载右dll.
处理这个问题的正确方法是什么?我不想要两个执行文件(一个用于32位,另一个用于64位)?如何在DllImport语句中使用DLL_FILE_NAME 之前设置它?
有没有办法让P/Invoke(DllImport)签名引用的特定DLL依赖于CPU架构?
我正在开发一个应用程序,它从第三方供应商的本机dll加载大量方法签名,在这种情况下是用户空间接口DLL到一块硬件.该供应商现在已开始提供DLL的x86和x64版本,我认为我的应用程序将受益于作为64位进程运行.除了这个DLL,一切都是.NET代码,所以构建为"任何CPU"都可以.
本机DLL中的所有方法签名在64位上都相同,但DLL的名称不同(Foo.dll与Foo_x64.dll).有没有办法通过P/Invoke签名或app.config条目我可以让它根据正在运行的CPU架构选择加载哪个DLL?
如果不是不同的DLL名称,它在不同的文件夹中是相同的名称,它是否打开任何其他选项?
注意:因为此用户空间DLL的版本必须与安装的硬件内核驱动程序匹配,所以DLL不与我们的应用程序捆绑在一起,而是依靠供应商安装程序将其放在%的目录中路径%.
在.Net Core中,您可以使用[DllImport]进行PInvoke,
但是如果你想动态加载和映射本机api调用,DllImport并不能解决问题.
在Windows上,我们使用DllImport到LoadModule处理了这个问题.然后,您可以使用GetProcAddress将地址映射到您可以调用的委托,从而有效地动态加载api调用.
有没有办法在.Net Core中开箱即用,这样你的逻辑加载工作就可以在Linux,Mac OSX和Windows上跨平台工作?
这可以建立,但我试图看看有没有办法在追逐那只兔子之前做到这一点.
c# asp.net-core-mvc .net-core asp.net-core-1.0 asp.net-core-2.0
上下文:我将旧版独立引擎转换为组合工具的插件组件.从技术上讲,这意味着我将引擎代码库编译为C DLL,我使用P/Invoke从.NET包装器调用它; 包装器实现由组合工具定义的接口.这非常有效,但现在我收到了为不同项目加载多个引擎实例的请求.由于引擎将项目数据保存在一组全局变量中,并且由于具有引擎代码库的DLL仅加载一次,因此加载多个项目意味着项目数据被覆盖.
我可以看到许多解决方案,但它们都有一些缺点:
您可以使用相同的代码创建多个DLL,这些代码被Windows视为不同的DLL,因此不会共享其代码.如果你有不同名称的引擎DLL的多个副本,这可能已经有效.但是,使用DllImport属性从包装器调用引擎,我认为在编译包装器时需要知道引擎DLL的名称.显然,如果我必须为每个项目编译不同版本的包装器,这非常麻烦.
引擎可以作为单独的进程运行.这意味着包装器在加载项目时会为引擎启动一个单独的进程,并且它将使用某种形式的IPC与此进程进行通信.虽然这是一个相对干净的解决方案,但它需要一些努力才能开始工作,我现在不知道哪种IPC技术最适合建立这种结构.通信也可能存在很大的开销:引擎需要经常交换浮点数组.
该引擎可以适应多个项目.这意味着全局变量应该放入项目结构中,并且对全局变量的每个引用都应该转换为相对于特定项目的相应引用.大约有20-30个全局变量,但是可以想象,这些全局变量是从整个代码库引用的,因此需要以某种自动方式完成此转换.一个相关的问题是你应该能够在所有地方引用"当前"项目结构,但是在每个函数签名中作为额外参数传递它也很麻烦.是否存在一种技术(在C中)来考虑当前的调用堆栈并在那里找到最近的相关数据值的封闭实例?
stackoverflow社区可以就这些(或其他)解决方案提供一些建议吗?