【发布时间】:2010-06-02 20:29:46
【问题描述】:
两个问题:
1) 基本 .NET 程序集不包含在 ILmerged 程序集中
从 .NET 3.5/Visual Studio 2008 升级到 .NET 4/Visual Studio 2010 后,我在后期构建中使用 ILMerge 时遇到问题。我有一个解决方案,其中包含多个目标框架设置为“.NET”的项目框架 4"。我使用以下 ILMerge 命令将各个项目 DLL 合并到一个 DLL 中:
if not $(ConfigurationName) == Debug
if exist "C:\Program Files (x86)\Microsoft\ILMerge\ILMerge.exe"
"C:\Program Files (x86)\Microsoft\ILMerge\ILMerge.exe"
/lib:"C:\Windows\Microsoft.NET\Framework64\v4.0.30319"
/lib:"C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\PublicAssemblies"
/keyfile:"$(SolutionDir)$(SolutionName).snk"
/targetplatform:v4
/out:"$(SolutionDir)bin\development\$(SolutionName).dll"
"$(SolutionDir)Connection\$(OutDir)Connection.dll"
...other project DLLs...
/xmldocs
如果我不指定 .NET 4 框架目录的位置,我会从 ILMerge 收到“不允许的未解析的程序集引用:系统”错误。如果我不指定 MSTest 目录的位置,则会收到“不允许使用未解析的程序集引用:Microsoft.VisualStudio.QualityTools.UnitTestFramework”错误。
上面的 ILMerge 命令运行并生成一个 DLL。但是,当我在另一个 .NET 4 C# 项目中引用该 DLL 并尝试在其中使用代码时,我收到以下警告:
无法解析主要引用“MyILMergedDLL”,因为它间接依赖于具有更高版本“4.0.65535.65535”的 .NET Framework 程序集“mscorlib, Version=4.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”比当前目标框架中的“4.0.0.0”版本。
如果我随后删除 /targetplatform:v4 标志并尝试使用 MyILMergedDLL.dll,我会收到以下错误:
“System.Xml.Serialization.IXmlSerializable”类型在未引用的程序集中定义。您必须添加对程序集 'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 的引用。
看来我不应该这样做。使用我的 MyILMergedDLL.dll API 的人不必添加对它引用的任何库的引用。我该如何解决这个问题?
2) 仅在使用合并程序集时才出现 TypeLoadException
编辑:除此之外,即使我在使用 MyILMergedDLL.dll 的消费者项目中添加了对 System.Xml 的引用,使用 MyILMergedDLL.dll 中的一些代码也会产生此异常:
System.TypeLoadException:无法从程序集“MyILMergedDLL,Version=1.0.1.1,Culture=neutral,PublicKeyToken=...”加载类型“System.Func`2”。
这是我的消费者项目中的代码;导致TypeLoadException 的行是第二行:
var keys = new[] {"a", "b", "c"};
var row = new Row(keys);
引发TypeLoadException 的特定Row 构造函数在MyILMergedDLL 的公共类中定义,当我在引用单个项目DLL 时使用此构造函数时,它工作正常。只有当我在引用 IL 合并的 DLL 时使用此构造函数时,才会出现异常。不知道怎么回事。
这是构造函数:
public Row(IEnumerable<string> keys) : base(keys) { }
它所指的base 有这个代码:
foreach (string key in keys.Where(
key => !string.IsNullOrEmpty(key)
))
{
_dic.Add(key, string.Empty);
}
【问题讨论】:
-
虽然这个问题没有要求替代方案,但我需要推荐使用Costura Fody。它就像一个魅力。打包就像添加 NuGet 引用一样简单:)
标签: .net dll assemblies c#-4.0 ilmerge