在启用 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 错误