2017-05-30 108 views
-2

我如何從我的C#代碼中引用我的C代碼混淆。我已經閱讀並意識到DLL是有用的,但我不知道如何連接我的DLL。從我的理解,我從我的C代碼的DLL?請幫助傳遞到C代碼從C#代碼在Visual Studio

C#(Visual Studio代碼)

public partial class Form1: Form{ 
    [DllImport("simple.dll", CallingConvention = CallingConvention.Cdec1)] 
    public static extern void pinfo(string str); 

    private void button1_Click(object sender, EventArgs e){ 
     pinfo("yay"); 
    } 
} 

C代碼 - simple.c

#include <stdlib.h> 
#include <stdio.h> 
#include <time.h> 
__declspec(dllexport) void pinfo(char* str){ 
    printf("You are in the method %s\n, str); 
} 

int main(void){ 
} 

我的問題是如何將C代碼連接到C#代碼因此,「你在方法耶」行打印出來?我不明白如何將dll文件鏈接到Visual Studio或如何創建dll文件。感謝

+3

檢查https://stackoverflow.com/questions/11425202/is-it-possible-to-call-ac-function-from -c-net和https://stackoverflow.com/questions/2874603/is-it-possible-to-embed-c-code-in-ac-sharp-project –

+0

你的代碼對我來說看起來很好。當你嘗試運行它會發生什麼? (請注意,您需要首先導出'pinfo'函數)。使用'__declspec(dllexport)' – Dai

+0

@dai我添加了這一行,我不確定如何運行它,因爲我有一個visual studio項目,然後是一個與我的visual studio項目無關的simple.c文件,我不確定如何鏈接它們 – Aak

回答

0

有用於獲得的P/Invoke(DllImport)使用.NET的3個主要步驟:

  1. 出口從C/C++項目的功能。

    在Visual C++中,使用__declspec(dllexport)extern "C"修飾符,分別告訴編譯器導出函數的DLL,以便它是由名字可見,並且不碾壓名稱或者 - 否則編譯器將刪除如果項目中沒有調用者(「死代碼移除」),則該函數完全是這樣。功能也可以由一個序數,而不是出口,這大概不是你所感興趣的問題。

  2. 確保您正在爲同一ISA。

    當您使用.NET的P/Invoke,您引用的DLL將被加載到託管.NET過程,所以DLL必須建立在相同的CPU指令集作爲當前的.NET程序。 .NET項目AnyCPU模式在默認情況下運行,但在最近版本的Visual Studio,他們「喜歡」的32位(x86)模式而不是64位(x64/AMD64)。爲了避免任何混亂,決定是否要32位或64位模式,並迫使你的.NET項目建設只對ISA,然後設置你的C/C++項目建設爲ISA了。

  3. 確保目標DLL文件位於.NET可執行文件的PATH中 - 通常這意味着只需將其與構建的.NET可執行文件放在相同的bin輸出目錄中即可。

    請注意,由於此DLL文件不是.NET程序集,因此沒有「項目引用」或「程序集引用」的概念,因此您需要專門配置項目,以便Visual Studio(MSBuild)將複製DLL文件到您的bin文件夾 - 您可以通過添加DLL文件,在Solution Explorer中的.NET項目的根,然後選擇文件做到這一點,打開屬性窗口,然後選擇「生成操作:內容。」和「複製到輸出目錄:始終」。

關於「鏈接」 - 的DLL在編譯時沒有鏈接 - 線索是在名稱中:「動態鏈接」:鏈接在運行時由操作系統不被執行,編譯器。

對於P上的更多信息/ Invoke的,我建議你閱讀這QA:Why are Cdecl calls often mismatched in the "standard" P/Invoke Convention?

+0

「請注意,您的DllImport聲明不正確」中的所有內容都是錯誤的。非託管函數是cdecl,默認編組很好。 –

+0

不,你錯了。默認編組是使用主要字符集來終止空字符數組。在桌面窗口中缺省爲ANSI。所有記錄。你應該閱讀文檔。 –

+0

@DavidHeffernan我的錯誤。我進一步閱讀,並誤解了文檔。我從我的答案中刪除了不正確的斷言。 – Dai