c# - 在 C# 程序中使用多个用 C 编写的 DLL

标签 c# c visual-studio dll

我有一个用 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 WalkerProcess Monitor可能有用。首先有助于了解依赖项是什么,其次检查您的应用程序是否正在尝试查找组件。

将 Process Monitor 配置为仅显示进程事件,并使用您的应用程序名称应用进程名称过滤器,如下图所示,您将获得您的应用程序尝试访问的所有文件。它将有助于找到丢失的 dll。 Process Monitor filtering

关于c# - 在 C# 程序中使用多个用 C 编写的 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28475830/

相关文章:

c - 如果您尝试访问全局变量,这个互斥体不应该是 "lock"吗?

c - 使用 epoll 的多线程 UDP 服务器?

visual-studio - 是否有 VisualSVN 或 AnkhSVN 的免费替代品?

visual-studio - VS 复制代码位置是否有任何扩展?

c# - 引用 AssemblyInfo.cs 中的项目时发布预编译的 ASP.NET 失败

c# - RESTful WCF Web 服务 POST 问题

c# - 身份服务器 4 API 身份验证失败

c# - 如何获取缺少的程序集中包含的类型名称

c - 以正确的顺序读取内存需要一些帮助

wpf - Visual Studio 的 WPF 属性 Pane 的怪癖