我一直在各处搜索,无法找到如何执行此操作:
我试图在我的c#代码中使用非托管dll。使用dependancy walker我发现我还需要包含kernel32.dll,msvcp120d.dll和msvcr120d.dll的导入。目前我只是像这样打电话给我的dll
[DllImport("ExApcpp.dll", CallingConvention = CallingConvention.Cdecl)]
public extern static string cb_organise_i (int a1);
(其中cb_organise_i是dll中的一个函数。)
我使用xamarin并不断收到错误
[Mono] Probing '_monodroid_gref_log_delete'.
[Mono] Found as '_monodroid_gref_log_delete'.
[Mono] DllImport attempting to load: 'ExApcpp.dll'.
[Mono] DllImport error loading library './libExApcpp.dll': 'dlopen failed: library "/data/data/workex.workex/lib/./libExApcpp.dll" not found'.
[Mono] DllImport error loading library './libExApcpp.dll.so': 'dlopen failed: library "/data/data/workex.workex/lib/./libExApcpp.dll.so" not found'.
[Mono] DllImport error loading library 'libExApcpp.dll': 'dlopen failed: library "/data/data/workex.workex/lib/libExApcpp.dll" not found'.
虽然我的dll在应用程序文件夹中。另外,我没有一个名为libExApcpp.dll的文件(我使用swig和vs2013来包装我的c ++代码并制作dll)
我是否在正确的界限上假设我需要其他三个dll,如果是这样,我将如何包含/实施它们?
很抱歉,如果这是一个愚蠢的问题,但我对答案视而不见。
答案 0 :(得分:0)
Mono是CLR(公共语言运行时)的实现。它提供托管代码所需的DLL。 Kernel32是Windows的一部分,托管代码不需要。因此,它不是Mono的一部分,也不能将它提供给Mono。
这当然意味着您无法在Mono上运行非托管DLL。那不足为奇;要运行非托管代码,您需要Wine而不是Mono。
答案 1 :(得分:0)
您已使用Visual Studio编译代码以定位桌面Windows。但是你的Xamarin项目并不针对桌面Windows,而是通过错误消息的外观来针对Android。
为了能够调用此非托管代码,您需要使用面向正确平台的编译器对其进行编译。您不是针对桌面Windows,因此不要使用桌面Windows编译器。使用针对您的实际平台的编译器。
现在,很容易说这个,也许更难实现。也许非托管代码不是跨平台的,而是依赖于Windows API。在这种情况下,您需要删除/替换所有此类非可移植依赖项。