繁体   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