2011-06-17 66 views
5

我有一個C程序,我創建了一個DLL文件。我正在使用Windows Vista和Visual C++。從C#程序的DLL訪問方法

現在我需要從該C#代碼的Main()方法訪問該DLL中的方法。什麼是這樣做的步驟?

到目前爲止,我已經添加了DLL文件作爲參考,然後我該怎麼辦?

這僅僅是一個例子:

int main1(void) { 
    prinf("Hello World"); 
} 

請注意,這個類也使我們的其他的.lib功能,但我能成功創建DLL出來。 (我不知道這是否相關)

現在我需要從我的C#Main()中訪問此方法;

[STAThread] 
static void Main() 
{ 
    // I need to call that main1() method here 

    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    Application.Run(new Form1()); 
} 
+0

添加對本機C DLL的引用是不可能的。顯然你並沒有使用真正的C DLL,也許是C++/CLI。在這種情況下沒有什麼特別的要求,你公開的「ref class」聲明可以直接在C#程序中使用。 –

+0

是的,它是一個C++/CLI項目。根據你的答案,它似乎可以直接完成,說'ref class'你的意思是我的C類嗎?我如何讓它公開? 我到目前爲止所做的步驟是,添加dll作爲參考,並添加了以下語句'using detect.h',並嘗試從C#,Main()方法中訪問它,如: 'detect.the_method_i_need()',但它沒有像那樣工作。 HELP – illep

回答

5

using a class defined in a c++ dll in c# code其中有一個很大的接受的答案。 Hans Passant在評論中寫道,你不能將一個本地DLL作爲對C#項目的引用。

當我引用我自己的本機DLL之一時,通常要麼在C#項目和生成本機DLL的項目之間添加依賴關係,要麼將該DLL添加爲C#項目中的鏈接內容文件,如所以:

  1. 右鍵單擊該項目並選擇添加>現有項目。
  2. 瀏覽並選擇你想要的DLL,但不要點擊添加呢。
  3. 點擊添加按鈕的右邊的小箭頭並選擇添加爲鏈接
  4. 選擇現在出現在C#項目中的DLL並轉到其屬性。
  5. 確保你有構建動作設置爲內容

這將在Microsoft安裝程序的DLL複製到C#項目的bin\Debug文件夾,並確保,如果你一旦決定創建一個安裝項目,你可以很容易地引用所有內容文件,包括他們包。

現在,爲了能夠看到在您的本地DLL中編寫的函數,您必須小心導出它們(請參閱Exporting C Functions for Use in C or C++ Language Executables和)。所以你必須在你的函數聲明中添加一個extern "C"塊(我假設你在中編寫了你的​​代碼。CPP源文件,這意味着編譯器將發出錯位函數名,如果你不把他們定義爲extern "C"):

extern "C" 
{ 
    __declspec (dllexport) void __cdecl Foo(const char* arg1); 
} 

... 

void Foo(const char* arg1) 
{ 
    printf ("Hello %s !", arg1); 
} 

__declspec (dllexport)裝飾意味着編譯器/連接器將不得不作出功能從DLL的外部可見。 __cdecl定義了參數如何傳遞給函數(標準的「C」方法)。

在你的C#代碼,你必須參考你的DLL的導出的方法:

class Program 
{ 
    [DllImport("mydll.dll")] 
    internal static extern void Foo(string arg1); 

    static void Main() 
    { 
     Program.Foo ("Pierre"); 
    } 
} 

你應該閱讀Platform Invoke Tutorial這給所有的血淋淋的細節。

+0

你好@Pierre,我跟着你的步驟,我不知道如何設置**內容**作爲**生成行動**,但是,當我編譯的代碼,我沒有找到我的DLL的副本我的C#項目的_bin \ Debug_。希望你能幫助我,還可以告訴我如何訪問我從C#項目的Main()方法中添加的DLL的方法。 – illep

+1

@illep:點擊C#項目中的DLL文件,按F4。在「屬性」工具窗口中,第一行標記爲「構建操作」。點擊它的右側,選擇「內容」。確保「複製到輸出目錄」設置爲其中一個複製選項。 –

+0

@illep:編輯您的文章並添加您想要訪問的C代碼示例。您必須確保您的C函數使用DLL導出指令正確裝飾。 –

0

您正在尋找Platform Invoke[DllImport]屬性。

+0

我做了以下/ N '[的DllImport( 「detect.dll」)] 內部靜態外部INT MAIN1();' ,'detect.dll'是我的DLL我創建的名稱。 main1()是我希望從我的C#代碼執行的方法。現在,從我的C#代碼中調用main1();方法,我得到一個錯誤** DLL沒有發現異常**,但該DLL位於_bin \ Debug_文件夾中。我如何解決這個問題。 注意:這是我如何添加我的DLL,R - 點擊該項目並添加引用 - >選擇DLL – illep

0

您需要在p個讀上/調用又名的PInvoke又名 「平臺調用」:

http://msdn.microsoft.com/en-us/library/aa288468(v=vs.71).aspx

+0

是的,我已經通過了這個教程,但我不明白是什麼**公共靜態外部**的意思。我無法編輯使用visual C++編寫的C代碼。無論如何,我有代碼作爲DLL文件。例如考慮下面的代碼段; 'void main(){ printf(「HELLO WORLD」); } 上面是我的C代碼,現在它是一個DLL,我如何從我的C#Main()方法訪問這個main()。我基本上想執行main()(我的c代碼)中的內容。 幫助! – illep

+0

@illep:如果你不能修改你的DLL,那麼你運氣不好 - 函數必須導出才能從外部訪問它們。如果你的DLL是一個僞裝的EXE(帶有一個'main'函數),那麼你可以使用'System.Diagnostics.Process.Start'來執行這個DLL,我猜。 –

+0

@Pierre是的,我已經嘗試過,但我不想打開控制檯。無論如何要避免這種情況? – illep