C# DLLImport for C++ dll

本文关键字:dll C++ for DLLImport | 更新日期: 2023-09-27 18:15:10

我有一个。dll内置在c++/CLI和。net。因此,它的目标是。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 "。main' from assembly 'myapp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null',因为方法'runfile'没有实现(没有RVA)。"

为什么会出现这个错误,我该如何修复它?

C# DLLImport for C++ dll

如果需要两个函数,则必须添加两次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#代码?

据我所知,您已经创建了一个用c++实现的托管类库。您希望在其他托管代码(用c#, VB编写)中使用这个类库(汇编)。网,等等)。目前,您已经导出了一些方法(您的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);
    }

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