如何包含我的非托管 dll 需要的 dll,例如 kernel32.dll

Posted

技术标签:

【中文标题】如何包含我的非托管 dll 需要的 dll,例如 kernel32.dll【英文标题】:how do I include dll's such as kernel32.dll which my unmanaged dll needs 【发布时间】:2014-07-17 18:16:05 【问题描述】:

我一直在到处搜索,但找不到如何做到这一点:

我正在尝试在我的 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,我是否在正确的路线上,如果需要,我将如何包含/实现它们?

对不起,如果这是一个愚蠢的问题,但我已经对答案视而不见。

【问题讨论】:

旁注:对于非 Windows 平台(这似乎是您基于 Xamarin 标记的目标),调用本机代码根本不可能工作。还取决于运行时的“D”(调试)版本不是一个好主意... kender32?确定不是 kernel32 吗? 是的,我的坏@MSalters 为什么要链接到运行时的调试版本?你的问题不是你没有导入足够的函数,而是你的 DLL 没有加载。 【参考方案1】:

Mono 是 CLR(公共语言运行时)的实现。它提供托管代码所需的 DLL。 Kernel32 是 Windows 的一部分,托管代码不需要。因此它不是 Mono 的一部分,您也不能将其提供给 Mono。

这当然意味着您不能在 Mono 上运行非托管 DLL。这并不奇怪;要运行非托管代码,您需要 Wine 而不是 Mono。

【讨论】:

在 Linux 上。而且当非托管 DLL 在 Windows 上沿着 Mono 运行时,它仍然不能在 Mono 之上运行。 @DavidHeffernan:没有 Windows 标签,但有一个 Xamarin 标签。尝试在 iPhone 上 pinvoke kernel32 不会给您带来有用的结果。 好的,我想我认为这是 Windows,因为 asker 试图链接到 VS 编译的 DLL,这些 DLL 显然适用于 Windows。但这是安卓对吧?在这种情况下,问题的整个前提都是错误的。但是你可以从 Mono 中调用非托管代码。 @DavidHeffernan:他正在尝试使用自己的非托管 DLL,该 DLL 是在 VS2012 中编译的,因此会拖入 VS2012 运行时以及 Kernel32。 Xamarin 是 android/iPhone,所以你甚至不能假设 x86。【参考方案2】:

您已使用 Visual Studio 编译代码以面向桌面 Windows。但是您的 Xamarin 项目不针对桌面 Windows,它通过错误消息的外观针对 Android。

为了能够调用此非托管代码,您需要使用针对正确平台的编译器对其进行编译。您的目标不是桌面 Windows,因此不要使用桌面 Windows 编译器。使用针对您的实际平台的编译器。

现在,说起来容易,实现起来可能更难。也许非托管代码不是跨平台的,而是依赖于 Windows API。在这种情况下,您需要删除/替换所有此类不可移植的依赖项。

【讨论】:

以上是关于如何包含我的非托管 dll 需要的 dll,例如 kernel32.dll的主要内容,如果未能解决你的问题,请参考以下文章

编写用于 C# 的非托管 C++ DLL

从 C# 线程内的非托管 dll 运行函数

一个解决方案中的非托管 DLL 项目和托管 WinForms 应用程序

WCF 服务调用具有复杂数据类型的非托管 c++ dll

几个appdomains调用相同的非托管DLL

在Visual Studio 2010中将Native / C ++ DLL链接到托管C ++ / CLI包装器