我有一个用 C# 编写的程序。我想在此程序中使用用 C 编写的 DLL。
public class Test
{
[DllImport(@"C:/.../surcouche2.dll")]
public static extern int refreshEntities();
}
我将函数称为:
Test.refreshEntities();
我正在使用 Visual Studio。为了创建 DLL surcouche2.dll
,我创建了一个新的 Visual C++ 应用程序控制台,然后我选择了 DLL 并将选项保留为默认值。然后,我告诉VS用C编译。
函数是:
__declspec(dllexport) int refreshEntities() {
int ret = 0;
LibData *n;
n = newLibData(LIB_MODULES_MODULE_ENTITES, LIB_MODULES_ACTION_SELECT,
"http://10.0.2.2:4242/WebService1.asmx");
if (n)
{
ret = n->refreshDb(n);
n->destroy(n);
}
return (ret);
}
调用的函数在另一个DLL(被引用)中。但是我得到这个错误:
system.DllNotFoundException: Impossible de charger la DLL 'C:/.../surcouche2.dll': Le module spécifié est introuvable. (Exception de HRESULT : 0x8007007E)
à app.Lol.refreshEntities()
à app.MainWindow..ctor() dans c:\...\MainWindow.xaml.cs:ligne 30
但是,如果我像这样更改函数 refreshEntities
,那么它可以正常工作:
__declspec(dllexport) int refreshEntities() {
return (42);
}
第二个 DLL 使用另一个 DLL(均在 C 中)。我使用“创建一个空项目”选项创建它们,所以我没有 stdafx.h
, ... 文件。我想这不是问题,因为我可以在第二个 DLL 中使用第三个 DLL 中的函数。
最佳答案
如果无法解析加载的 dll 的依赖项,则会发生此错误。
首先,我建议您将两个 native 程序集放在一个 bin 文件夹中并更改一个引用
从 [DllImport(@"C:/.../surcouche2.dll")]
到 [DllImport("surcouche2.dll")]
一般用于调试依赖性问题的工具,如 Dependency Walker和 Process Monitor可能有用。首先有助于了解依赖项是什么,其次检查您的应用程序是否正在尝试查找组件。
将 Process Monitor 配置为仅显示进程事件,并使用您的应用程序名称应用进程名称过滤器,如下图所示,您将获得您的应用程序尝试访问的所有文件。它将有助于找到丢失的 dll。
关于c# - 在 C# 程序中使用多个用 C 编写的 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28475830/