2010-12-21 38 views
3

這是可能通過C#.NET編寫Win32.dll文件嗎? 如果是的話,我可以在哪裏找到一些教程? 如果不是,那麼你有什麼建議寫Win32.DLL?這是可能通過C#.NET編寫Win32.dll文件嗎?

謝謝。

+2

你想達到什麼目的?沒有更多的上下文,'寫Win32.dll'是沒有意義的。 – Oded 2010-12-21 11:20:08

+1

你想調用現有的Win32 dll,或者將C#編譯爲原生的win32代碼嗎? – 2010-12-21 11:20:46

+0

我想寫本地win32 DLL,其他應用程序可以使用它,就像我們在C#中的代碼:[DllImport(「myLibrary.dll」)] – losingsleeep 2010-12-21 11:25:36

回答

2

這聽起來像你正試圖創建一個經典的Win32 DLL與Win32風格的出口? (Win32風格的導出是DllImport選擇的。)您無法使用託管代碼(C#或託管C++)來執行此操作。據我所知,你需要使用非託管C/C++來做到這一點。

由Charles Petzold編寫的Windows或類似Win32編程的書可能是一個很好的開始;或者找到一個'hello world'的Win32 DLL樣本。或者只是在Visual Studio中創建一個Win32 DLL項目並查看它爲您創建的文件,可能應該有一些佔位符文本讓您開始。

託管代碼使用的文件也具有.dll作爲擴展名,但它們實際上是託管代碼的容器,並且沒有Win32樣式的入口點,所以其他需要Win32入口點的代碼不能使用他們。它們有時被稱爲「託管程序集」而不是dll以避免混淆。

-

更新 - 有可能是一個替代選項:您可以創建什麼叫做"Mixed mode DLL"這是同時包含本地代碼和託管代碼的DLL。然後,這個DLL可以擁有您想要「導出」的託管C#類以及少量導出Win32樣式API的混合C/C++。雖然這是可能的,但這不一定是件好事:代碼期望加載一個普通的Win32 DLL,因此可能不會期望加載CLR;如果該進程已經加載了CLR的衝突版本,則可能會遇到問題。混合模式DLL往往更容易讓C#程序集重用C/C++代碼,而不是讓C#/託管代碼僞裝成Win32 DLL。

1

您可以暴露你寫的COM對象的任何.NET程序集。

請參閱these tutorials(對於VS 2003,但仍有效)。

+0

謝謝。你可以告訴我,我可以在C#.NET中編寫COM DLL並使用它,就像本機win32 DLL一樣嗎?例如我們可以通過[DllImport(「myLibrary.dll」)]屬性(等等)導入本機win32 DLLs,COM DLLs可能嗎? – losingsleeep 2010-12-21 13:24:24

+1

@ user434186 - 使用C#,您無法編寫COM dll。如果您按照我在答案中鏈接的教程中的步驟操作,則可以將它們用作COM dll。 – Oded 2010-12-21 13:29:53

3

是的,這是可能的。事實上,這有一個工具。它在Rainmeter應用程序中有點隱藏。

Rainmeter SDK for C#包含一個名爲CS_DLL_FOR_C.exe的可執行文件,它將公共靜態方法轉換爲可由本機應用程序調用的外部函數。事實上Rainmetere本身是用C++和加載插件通過LoadLibrary

開發您可以使用以下鏈接

x86 version

x64 version

PS下載此工具的x86和x64版本:我不知道如果它違反Rainmeter的許可證分發這個工具。

相關問題