2011-11-20 96 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); 
    } 

我希望我能正確理解你的問題。