繁体   English   中英

C#DLLImport for C ++ dll

[英]C# DLLImport for C++ dll

我有一个.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,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'加载类型'myapp.main',因为方法'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.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);
    }

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM