2012-09-13 87 views
2

我有一個現有的C#應用​​程序。我想要的是爲C#應用程序的某些部分編寫本地代碼以提高速度,另一部分使用C#應用程序,另一部分使用C++/CLI爲C#應用程序提供接口。所以對於後面的部分,我需要將C#代碼轉換爲C++/CLI。將一些C#代碼轉換爲託管或C++/CLI代碼

我想知道如果我可以將我的C#代碼轉換爲C++/CLI代碼。也許將.NET程序集轉換爲C++/CLI會是獲取特定代碼的更好辦法。我看着反射器和它的插件CppCli。但插件不再可用。所以我正在尋找任何方法來實現這一點。我將不勝感激任何建議。

+3

你爲什麼要這樣做?一般來說,除CLI之外,你應該避免做任何事情。 – mydogisbox

+0

那麼,我已經編寫了原型的c#代碼,並且我們希望通過C++應用程序提高其速度。我想知道我是否可以自動化轉換過程。 –

+0

用C++/CLI(或者至少不是很明顯)你不會提高速度。你可以用本地C++提高速度,但正如你可能知道的那樣,這種轉換並不是微不足道的。(我們生產的C#到C++轉換器,但即使有一定程度的自動轉換,這絕對不是心靈的懦弱)。 –

回答

3

一般來說C++/CLI的運行時間與C#大致相同(兩者都被管理,可能會被轉換爲相同的IL)。如果應用程序的某個部分需要運行得更快,則可以編寫C++/CLI層,以便您的C#應用​​程序可以與某些本機C++進行交互。如果您適當編寫本地C++,這將會更快。正如Ben Voigt所指出的那樣,C++/CLI可能比C#更優化,但仍然不及編寫良好的本地C++那麼快,因爲它仍然是可管理的。

如果您打算在C++/CLI中打包一些本地代碼,那麼轉換工具可能不會以有用的方式構造它。你最好只是手工編碼interop部分。

在那裏有commercial tools這樣做,但我認爲你還是更好的手動做。

+0

我正是這樣做。我正在編寫本機DLL,但仍然需要C++/CLI來連接我的C#應用​​程序。對於那個C++/CLI部分,我需要轉換。也許我必須更好地解釋。 –

+2

在某些情況下,C++/CLI編譯器比C#編譯器產生更多優化的IL(C++團隊長期以來一直在編寫優化程序,並且有許多技巧在他們的袖子中)。 –

+0

@BenVoigt更新。 – mydogisbox

1

您可能不必轉換代碼。

link.exe是C++編譯器工具的一部分,它能夠在同一個程序集中包含C++和C#代碼。 C++位可以包含託管代碼和非託管代碼的混合。您首先必須使用C#編譯器(csc.exe)的命令行開關將C#代碼編譯爲.netmodule,然後您可以使用link.exe將其編譯爲具有C++代碼的程序集。從創建混合語言程序集到現在已經有一段時間了,如果細節不是100%,請致歉,但是要搜索上述條款並找到一種方法。

我似乎記得,關鍵部分是記住C++編譯器比其他編譯器更先進,因此可以使用C#/ VB netmodules,但不是相反。我發現編譯成單個程序集而不是引用另一個程序集的好處在於,單個程序集的每個部分內部的類型可以相互交叉引用。通過在兩個獨立的程序集之間引用,類型感知關係必須是分層的。

C#中還有unsafe關鍵字,它允許在C#代碼文件的各個部分中使用C++ - ish樣式指針,並關閉數組邊界檢查。根據您的使用情況,這可能有也可能沒有關係。

就我個人而言,我發現在C++編譯器中運行一些計算密集型代碼的速度比C#快20倍,之後我使用C++中提供的指針對其進行了優化,這對我來說是值得的。