2010-07-22 23 views
3

我們有一種情況,即在C#(WPF)應用程序中使用一組第三方非託管C++庫,但我們也使用它們的一部分包含庫來構建我們自己的非託管庫用於我們的應用程序。在C#程序中使用C++常量

這些庫生成元數據,它存儲在數據庫中。但是,爲了使用元數據,我們必須在C#代碼中複製與此元數據相關的一些常量。

如果這些常數中的某些常數在版本之間改變,則存在潛在的問題。有沒有一種乾淨的方式讓C#應用程序使用C++包含文件中定義的常量?

感謝, WTS

回答

3

我有一個解決方案,你可能不認爲非常「乾淨」,但哪些工作。問題是,使用enum或#define預處理器指令將丟棄常量使用的符號名稱(如ERR_OUT_OF_MEMORY實際上只是一些整數)。

在C++代碼中,您可以定義一個函數,它接受符號的字符串名稱並返回其值。你可以使用std :: map,然後添加諸如std :: pair(「ERR_OUT_OF_MEMORY」,ERR_OUT_OF_MEMORY)之類的對,然後你可以使用DllImportAttribute從DLL中調用該函數,該函數允許.NET中的非託管互操作。不幸的是,這需要對常量進行處理和串處理,但優點是如果這些常量發生變化,將會自動執行。

另一種解決方案是編寫一個簡單的腳本,通過預處理器#define語句去,並與具有相同名稱一堆靜態常量創建了一個龐大的.NET類。這其實就不會那麼辛苦考慮到預處理器的簡單性(應該只需要Perl的幾行)

+0

編寫腳本實際上是我正在考慮的事情 - 我只是想知道我是否錯過了普遍接受的方法。 – 2010-07-22 19:17:55

3

你需要重新定義它們的內部C#,在C#包裝類。

不幸的是,如果常量發生變化,您還需要修改副本。 (版本之間切換常量是一個非常糟糕的主意,但是,所以希望第三方API不會這樣對你......)


話雖這麼說,這是你的選擇。例如,您可以製作一個使用該API的小型C++程序,並使用正確的格式將所有常量寫入.cs文件。如果常量在版本之間改變(至少如果值改變),這可以保護你,但是如果需要,你仍然需要更新你的程序以處理將來版本中的附加常量。

另一種選擇是使用C++/CLI直接在類中公開常量,並從C#中引用該程序集和類。

+3

'如果常量change' - 漂亮的矛盾。 – 2010-07-22 19:11:35

+0

+1我最近不得不在C#應用程序中使用舊的C++庫,Reed描述的幾乎完全是這樣,複製,我必須做的。 – ChadNC 2010-07-22 19:14:21

+0

你的意思是,「希望第三方API不會再對你做這件事......」:) – 2010-07-22 19:15:17