2012-09-05 57 views
1

我對處理DllImport的東西沒什麼經驗,所以如果你們中的任何人都能解決我的小問題,我很高興。我想導入一個在類中具有方法的dll。該方法應該返回一個字符串。如何在C#中使用DllImport處理導入dll的退貨?

所以here's一些代碼:

Form1.cs中(調用位置):

... 
public partial class Form1 : Form 
    { 
     [DllImport("lang.dll")] 
     public static extern string[] getValues(); 
     //     | 
     //error occures here v 
     string[] labels = getValues(); 
     Status prgmStatus; 

     public Form1() 
     { 
... 

language.cs(類我.dll文件):

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace lang 
{ 
    public class language 
    { 
     public language() 
     { 
     } 

     public string[] getValues() 
     { 
      string[] content = 
      { 
       "User", 
       "Password", 
       "Login", 
       "Create new account ->", 
       "Repeat password", 
       "E-Mail adress", 
       "Register", 
       "<- Back to Login" 
      }; 
      return content; 
     } 
    } 
} 

所以當我啓動我的程序時,它會調用dll的方法,並且會出現:

(圖片在這裏找到:

我怎麼可能避免這個錯誤並正確獲取數組?

感謝答案和解決方案, Paedow

更新:

它應該能夠從該路徑加載任何其他.dll文件,具有相同的結構,但其他內容。該DLL包含英語語言中窗體窗體的標籤。當有人想用他自己的語言來編寫這個程序時,他必須編譯一個帶有標籤的dll,然後替換dll。

另一個更新: 該dll文件不構建在相同的解決方案。該DLL是一個自己的解決方案,只有最終的.dll文件將用於我的程序,所以沒有引用。

+1

您正在使用DllImport作爲託管程序集。DllImport是_meant_用於非託管程序庫。你有沒有考慮過使用調用託管程序集代碼的許多基於反射的方法? –

+0

你也可以暴露一個接口,然後可以通過你的其他程序集消費 –

回答

1

當你與管理的dll工作,你不應該使用的函數[DllImport],它只能與託管DLL(see here the distinction)一起使用。

從現在開始,我每次執行過程中提到了「DLL」我指的是「託管DLL」

如果你想編譯的DLL您的應用程序(而不是「手動」加載它,我猜你不想要...)你可以添加一個引用:

  • 編譯後的dll文件(「.NET Reference」);
  • 僅當.dll項目和.exe項目位於同一解決方案中時.dll項目(「項目引用」)。

請參閱here the official documentation on this。欲瞭解更多解決方案/項目,您可以start here

0

您不必像@Simon Whitehead所說的那樣將DllImport託管程序集。剛纔提到在您的項目,然後

var l = new lang.language(); 
string[] labels = l.getValues();