在启用 CLR 但没有 CRT 的 VC++ 中创建 Win32 dll

Posted

技术标签:

【中文标题】在启用 CLR 但没有 CRT 的 VC++ 中创建 Win32 dll【英文标题】:Creating a Win32 dll in VC++ with CLR enabled but no CRT 【发布时间】:2015-06-30 02:48:50 【问题描述】:

我正在尝试创建一个简单的 Win32 DLL,其中包含一个函数,该函数将根据进程/应用程序的名称返回应用程序主窗口的窗口 ID 列表。最有效的方法是利用托管代码 Process.GetProcessesByName() 方法。但是,当生成的 DLL 在某些机器上工作时,它无法加载到其他机器的内存中。原来 DLL 是动态链接到特定版本的 CRT 库(具体为 msvcr120.dll)。因此,如果目标机器没有安装相同版本的 CRT 库,则 DLL 将无法工作。

我尝试通过使用 /MT 开关静态链接到 CRT 库来构建 DLL,但启用托管代码的 CLR 支持的开关与 /MT 开关不兼容

我还尝试通过使用 NODEFAULTLIB 开关并仅使用 WINAPI 调用来完全摆脱 CRT 库的 DLL。虽然我可以在不依赖 CRT 的情况下成功构建 DLL 的非托管部分,但是当我包含托管端口并打开 /clr 开关时,我收到以下错误:

eze_InstallScriptCA.obj : 错误 LNK2001: 无法解析的外部符号 "?.cctor@@$$FYMXXZ" (?.cctor@@$$FYMXXZ) .NETFramework,Version=v4.0.AssemblyAttributes.obj : 错误 LNK2001: 无法解析的外部符号 "?.cctor@@$$FYMXXZ" (?.cctor@@$$FYMXXZ)

有人建议如何创建一个独立于 CRT 版本且在 VC++ 中启用 CLR 的 WIN32 DLL?

提前致谢

【问题讨论】:

【参考方案1】:

这是不可能的。

但是,您可以将 msvcr120.dll 与您的应用程序一起分发。

【讨论】:

以上是关于在启用 CLR 但没有 CRT 的 VC++ 中创建 Win32 dll的主要内容,如果未能解决你的问题,请参考以下文章

关于“找不到附属汇编 Microsoft.VC90.CRT,上一个错误是 参照的汇编没有安装在系统上。”的解决

Visual Studio VC2013 在没有 AVX 的情况下启用 SSE4.1

在 Visual Studio 2012 中编译启用 CLR 的 C++ 项目时出现 C2248 错误

VC学习笔记---ATL MFC CLR三个库的区别

Visual Leak Detector 在 VC++ 的 CRT 模块中报告奇怪的泄漏

在我的 CLR 项目中添加包含会使 WLR 无法在启用 /clr 的情况下编译