避免在 C++/CLI 项目中加载 .Net Dlls?

Posted

技术标签:

【中文标题】避免在 C++/CLI 项目中加载 .Net Dlls?【英文标题】:Avoid loading .Net Dlls in a C++/CLI project? 【发布时间】:2009-10-06 19:19:47 【问题描述】:

我有一个用 C++/CLI 编写的项目。有些类型存在于托管代码中,有些则完全是本机代码。假设我在没有安装任何版本的 .Net 框架的机器上生成了 DLL,有没有办法让另一个本机应用程序与我的“混合模式”DLL 链接并仅使用本机类型?我注意到,在我添加“/clr”开关的那一刻,我的 Dll 自动依赖于几个 .Net Framework Dll(mscorjit、mscoree 等),当我实际尝试使用其中定义的 100% 本机类型时,应用程序仍会尝试加载那些 .Net Framework Dll(即使我没有在代码的那部分使用框架)。 那么,在这种情况下是否可以避免加载这些 Dll? (如我所见,另一种选择是创建另一个原生项目,该项目将包含所有原生类型,但不包含托管类型)。

谢谢

【问题讨论】:

【参考方案1】:

没有。当您加载混合模式程序集 (/clr) 时,在 DllMain 运行之后,.cctor 会立即运行并初始化框架(如果尚未为应用程序设置框架)。

没有这个,一旦你调用了一个需要托管 API 的函数,就会有很大的影响。有关详细信息,请参阅 MSDN 上的“Initialization of Mixed Assemblies”。

最好的选择是让您的原生 API 成为一个单独的 DLL,并将混合模式程序集作为一个单独的项目,这样您就可以在需要时单独加载它。

【讨论】:

以上是关于避免在 C++/CLI 项目中加载 .Net Dlls?的主要内容,如果未能解决你的问题,请参考以下文章

从 CLI C++ 应用程序在库中加载 C# WPF 表单

在 VS2003 中加载 c# 项目的问题

在托管 DLL 中加载 C++ DLL 时出现 EEFileLoadException

如何在 Vue 中加载外部 CSS

CodeIgniter - 如何在项目中加载 stripe-php 库?

未在面向 .NET Framework 的 .NET 标准项目中加载的调试符号