簡體   English   中英

使用CLI或任何其他方式將C ++庫靜態鏈接到C#進程

[英]Statically linking a C++ library to a C# process using CLI or any other way

是否可以使用用C ++編寫的靜態庫,並以某種方式將其集成到.NET進程中,以便將.NET進程與lib集成到一個exe文件中?
我的意思是,我知道我可以從C#進程中調用c ++ DLL,但是用戶仍然必須擁有C ++ DLL,但是是否可以使用lib而不是DLL?(這樣,用戶將不會甚至不知道該exe使用我的庫)。 如果可能,怎么辦?

在其他托管語言中唯一的C ++允許混合模式-在同一編譯單元(dll / exe / lib)中托管( C ++ / CLI )和本機C ++的組合,並且可以來回調用。 也許您可以利用它來創建一種膠合層。 我從來沒有嘗試過。

關鍵是/ clr編譯器開關-您將其應用於項目中的某些文件,而不應用於其他文件。 然后,您創建一些受管理的類/函數。 非托管位可以看到它們並調用它們,反之亦然。 傳遞原始類型是透明完成的,對於字符串來說,存在一些編組技巧。 我將在星期一發布更多內容。

編輯:似乎需要一些深奧的魔法。 不在混合C ++方面-在將結果鏈接到C#方面。 您會發現,Visual Studio IDE並不容易支持該方案。 很有可能,常規的構建過程將毫無用處。

EDIT2:您可以通過為編譯器指定/ LN命令行選項,並為鏈接器指定/ NOASSEMBLY來將C ++位編譯為.netmodule。 現在,將其鏈接到C#exe ...

我在visual 2008中做了類似的事情(我不知道新版本的VC是否仍然可行)。 因此有可能。 以我的經驗,您只能將本機C ++與托管C ++混合使用,而不能混合使用C#。 為此,我只是創建了一個解決方案,其中包含(以我為例)幾個用本機C ++編寫的庫,在托管C ++中創建了一個exe項目,並添加了對項目的依賴關系。 您將需要編寫一些包裝的托管C ++類,因為您不能在托管類中直接混合本機類型。 (您將遇到一些編譯錯誤,例如“錯誤C4368:無法將'nativeVar'定義為托管'ManagedClass'的成員:不支持混合類型”。

我不知道您為什么要在您的庫中使用.NET,就我個人而言,我想使用.NET接口,即使對我有用,這種混合還是讓我感到非常痛苦,如果我必須這樣做再次,我將使用帶有MFC或GUI庫的所有本機C ++。

不,這是完全不可能的。 現在在C ++ / CLI中禁止使用混合模式-代碼的每一位都是完全.NET或完全是本機的,並且跨越邊界的唯一方法是通過P / Invoke和DLL。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM