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)。"
为什么会出现这个错误,我该如何修复它?
如果需要两个函数,则必须添加两次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);
}
我希望我正确理解了你的问题。