【发布时间】:2008-12-04 17:55:36
【问题描述】:
我想用我的 C# 应用程序部署一个非常简单的 DLL,但是我在 Visual Studio 2008 中构建的任何 DLL 似乎都依赖于“Microsoft.VC90.CRT”。是否可以在没有这种依赖关系的情况下使用 VS2008 构建 DLL?如何判断导致依赖的原因?
【问题讨论】:
我想用我的 C# 应用程序部署一个非常简单的 DLL,但是我在 Visual Studio 2008 中构建的任何 DLL 似乎都依赖于“Microsoft.VC90.CRT”。是否可以在没有这种依赖关系的情况下使用 VS2008 构建 DLL?如何判断导致依赖的原因?
【问题讨论】:
我不确定最新的 VC++ 版本,但以前您可以告诉链接器链接 MSVCRT 运行时库的静态版本,而不是动态 (DLL) 版本。这个选项可能仍然存在。
【讨论】:
根据this MSDN page,静态库仍然可用。 转到项目属性、配置属性、C/C++、代码生成、运行时库。
为调试配置选择多线程调试,为发布配置选择多线程。 (不确定 VS2008 中的名称是否都相同,但应该是“附近的某个地方”。明天可以更新 VS2008 特定的差异)
另外,正如 wbic16 所建议的,使用依赖遍历器来识别其他静态依赖。
【讨论】:
如果您绝对确定您对 C 运行时没有任何依赖关系,那么您可以通过在链接器 -> 输入项目选项下启用“忽略所有默认库”(/NODEFAULTLIB)标志来避免链接它页。您可能还必须禁用基本运行时检查(在 C/C++ -> 代码生成下将“基本运行时检查”设置为默认值),并且您可能还必须删除入口点(将“无入口点”设置为“是 (/ NOENTRY)" 下链接器 -> 高级)。
另请参阅http://support.microsoft.com/kb/814472,它提供了一些关于为 C++ 托管扩展构建 DLL 的有用信息。
编辑:请注意,在没有 C 运行时的情况下运行也意味着您没有像 malloc() 和 new 这样的简单内存分配函数。
【讨论】:
试试这个工具:http://www.dependencywalker.com/。它将让您了解对给定 exe 或 dll 的依赖关系。
【讨论】:
通过一些工作,libCTiny 仍然可以作为默认库的替代品。这种库使 /NODEFAULTLIB 可用。
要回答您的第二个问题,使用 /VERBOSE 链接器开关,链接器会告诉您哪些符号来自哪个库。
【讨论】:
确保您在发布中构建的所有内容都像在调试中一样频繁,该 dll 与通常不随 windows 提供的特殊调试 dll 链接,并且会导致依赖性问题。
【讨论】: