是否可以采用用 C++ 编写的静态库并以某种方式将其集成到 .NET 进程中,以将 .NET 进程与 lib 集成到一个 exe 文件中?
我的意思是我知道我可以从 C# 进程中调用 C++ DLL,但用户仍然必须拥有 C++ DLL,但是是否可以使用 lib 而不是 DLL?(这样用户将不会甚至不知道 exe 使用我的库)。如果可能的话,怎么做?
3 回答
在其他托管语言中独一无二的是,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。