2010-11-24 84 views
5

我知道如何編寫MSIL代碼,但出於好奇,我想知道是否有解決方法來編寫彙編代碼。我可以想象一種方法,就像在一個字符串中編寫代碼並將其傳遞給一個本地窗口API,該窗口執行並返回結果,但不確定這是真實還是可能。可以在vb.net或C#中編寫彙編代碼嗎?

我想聽聽你的意見/ suggestions.Thanks

+2

你也用二進制代碼嗎? – N0Alias 2010-11-24 22:15:07

回答

2

您可以從C#中組裝它,並通過P/Invoke將生成的機器代碼傳遞到像這樣的C函數。

int execute(char* machine_code) 
{ 
    int(*fn)() = machine_code; 
    return fn(); 
} 

你需要擔心確保內存區域是可執行的,但這超出了這個答案的範圍。

3

不,它不可能直接在C#或VB.Net編寫彙編代碼。

最接近你可以做到這一點是將彙編代碼分爲導出C風格函數入口點的本地DLL。然後將PInvoke從C#/ VB.Net應用程序中移入這些入口點。

另一種選擇是使用C++/CLI,因爲它可以將彙編內聯到C++/CLI項目中。

+0

我明白了,所以正確的問題是,如果可以在C/C++中在運行時編譯彙編代碼,那麼如果可能的話,我們可以將彙編代碼串固定到本地dll – 2010-11-24 22:18:54

1

您可以使用fasm.dll編譯代碼,然後使用Marshal.GetDelegateForFunctionPointer使其可調用。

1

這裏的另一個(更多.NET)選項是在IL中編寫它,並使用ilasm編譯,或者像支持IL項目的MonoDevelop一樣編譯。

+0

當然,基於IL的程序集然後可以通過[`al.exe`](http://msdn.microsoft.com/en-us/library/c405shex.aspx)合併到C#程序集中。手動編輯MSBuild文件將是必需的... – Richard 2010-12-17 10:35:19