2011-11-20 141 views
3

我有一个建立在C++/CLI和.NET中的.dll文件。因此,它针对.NET应用程序。 API是一组使用托管类型的包装器,因此它是NET本机。我已经导入.dll和添加的功能等:C#DLLImport for C++ 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)“。

为什么会发生此错误,我该如何解决?

回答

13

您必须添加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#代码?

+0

我可以给它添加一个引用,但是当我尝试写入using指令时它不会显示,如果这是有道理的。 – david

+0

这是因为您已将函数导出为本地C++。尝试把它们作为一个静态的托管类来代替。 – Krumelur

+0

也使ref类公开,并把它放在一个名称空间。 – 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); 
    } 

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