【问题标题】:C# DLLImport for C++ dllC# DLLImport 用于 C++ dll
【发布时间】:2011-11-20 07:48:58
【问题描述】:

我有一个用 C++/CLI 和 .NET 构建的 .dll。因此,它针对 .NET 应用程序。 API 是一组使用托管类型的包装器,因此它是 NET 原生的。我已经导入了 .dll 并添加了如下函数:

[DllImport(@"maplib.dll")]
public static extern bool initialize(string a);

当我在我的 C# 代码中调用这个函数时,它工作正常,但如果我想添加另一个函数,比如..

[DllImport(@"maplib.dll")]
public static extern bool initialize(string a);
public static extern bool runfile(string a, string b);

我在运行程序时收到此错误。与第二个功能有关:

“无法从程序集 'myapp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' 加载类型 'myapp.main',因为方法 'runfile' 没有实现(无 RVA)。”

为什么会出现这个错误,我该如何解决?

【问题讨论】:

    标签: c# c++ dll dllimport managed


    【解决方案1】:

    如果你想要两个函数,你必须添加两次DllImport属性:

    [DllImport(@"maplib.dll")]
    public static extern bool initialize(string a);
    [DllImport(@"maplib.dll")]
    public static extern bool runfile(string a, string b);
    

    但是,如果您的 dll 是 .NET,那么为什么不添加对它的常规引用并像使用 C# 代码一样使用它呢?

    【讨论】:

    • 我可以添加对它的引用,但是当我尝试编写 using 指令时它不会显示,如果这有意义的话。
    • 这是因为您已将函数导出为本机 c++。尝试将它们作为静态放在托管类中。
    • 同时公开 ref 类并将其放在命名空间中。
    • @Krumelur 你是什么意思?我有点困惑,因为我对这类东西很陌生,而且 .dll 本身不是我制作的。
    • @Simon 你指的是什么参考类?
    【解决方案2】:

    据我了解,您已经创建了一个用 C++ 实现的托管类库。您想在其他托管代码(用 C#、VB.NET 等编写)中使用这个类库(程序集)。目前,您已将一些方法(您的 API)导出为原生 C++ 调用:

    public bool initialize(string a) {
        // ...
    }
    
    public bool runfile(string a, string b) {
        // ...
    }
    

    如果您希望能够从本机 C++ 代码调用您的库,这很有用,但如果您只想使用托管代码来调用您的库,我建议您将 API 创建为托管代码:

    public ref class MyLibraryFunctions {
        public:
            static bool initialize(string a);
            static bool runfile(string a, string b);
    };
    

    这样,您的 C# 代码中就不需要 DllImport。你可以这样做:

    using Something.MyLibrary;
    ....
        public void doSomethingThatNeedsMyLibrary() {
           MyLibraryFunctions.initialize(someString);
        }
    

    希望我正确理解了您的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-19
      • 2021-07-11
      • 1970-01-01
      • 1970-01-01
      • 2020-02-19
      • 2016-12-12
      • 1970-01-01
      • 2016-08-09
      相关资源
      最近更新 更多