将 ILMerge 与 .NET 4 库结合使用

2024-02-11

两个问题:

1) 基本 .NET 程序集不包含在 ILMerged 程序集中

从 .NET 3.5/Visual Studio 2008 升级到 .NET 4/Visual Studio 2010 后,我在构建后使用 ILMerge 时遇到问题。我有一个解决方案,其中有几个目标框架设置为“.NET Framework 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”,因为它间接依赖于 .NET Framework 程序集“mscorlib,Version=4.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”,该程序集的版本“4.0.65535.65535”比该版本更高当前目标框架中的“4.0.0.0”。

如果我然后删除/targetplatform:v4标记并尝试使用 MyILMergedDLL.dll,我收到以下错误:

类型“System.Xml.Serialization.IXmlSerialized”是在未引用的程序集中定义的。您必须添加对程序集“System.Xml,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”的引用。

看来我不必这样做。无论谁使用我的 MyILMergedDLL.dll API,都不必添加对其引用的任何库的引用。我该如何解决这个问题?

2) 仅在使用合并程序集时出现 TypeLoadException

Edit:除此之外,即使我确实添加了对System.Xml在使用 MyILMergedDLL.dll 的消费者项目中,使用 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);

特别是Row抛出的构造函数TypeLoadException定义在公共类中MyILMergedDLL,当我在引用各个项目 DLL 时使用此构造函数时,它工作得很好。只有当我在引用 IL 合并的 DLL 时使用此构造函数时,才会出现异常。我不知道发生了什么事。

这是构造函数:

public Row(IEnumerable<string> keys) : base(keys) { }

And the base它所指的有以下代码:

foreach (string key in keys.Where(
    key => !string.IsNullOrEmpty(key)
))
{
    _dic.Add(key, string.Empty);
}

有一个最近发布的 http://research.microsoft.com/en-us/people/mbarnett/changehistory.aspx解决 x64 问题。如果您仍有问题,请直接与 Mike Barnett 联系 (mbarnettat微软dot com)


附录。你有一些非常非常错误的事情/lib:"C:\Windows\Microsoft.NET\Framework64\v4.0.30319"选项。最近 .NET 4.5 发布后,这给很多程序员带来了麻烦。该目录是not.NET 4.0 参考程序集的正确选择。它的内容被 4.5 程序集覆盖,您不能再使用它来定位 .NET 4.0 安装。你得到的运行时错误非常尴尬,程序无法再找到某些类型。通常在[Extension]属性上进行轰炸,有时在ICommand接口上进行轰炸。

这些类型以及其他一些类型从一个程序集转移到另一个程序集。使用正确的参考组件是一项严格的要求。你must use:

 /lib:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0"

进行调整以匹配您的特定计算机和目标框架版本。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 ILMerge 与 .NET 4 库结合使用 的相关文章

随机推荐

  • Selenium Firefox IDE 可以实现吗?

    这是这个问题的后续 想要创建一个表单填充程序 java jsp html 足够吗 https stackoverflow com questions 17329996 want to create a form filler is java
  • Dropbox Saver 可以接受来自 createObjectURL() 的数据吗?

    Dropbox Chooser 和 Saver 工具 https www dropbox com developers dropins对于这两项任务来说似乎非常酷 让用户从 Dropbox 中选择一个文件 页面就可以下载它 即 Dropbo
  • 块与 Objective-C 中的普通方法和函数有何不同?

    与 Objective C 中的普通方法和函数相比 使用块有什么优势 我已阅读文档 但找不到块而不是其他语言功能的具体用法 我确信我错过了一些东西 所以有人可以用比现有文档更简单的方式解释块的优点吗 块是一种包装一段代码并有效存储它以供以后
  • 将 Angularjs 和 Rails 应用程序分离为独立组件

    我想尝试一下 Angularjs 然而 我一直难以决定应该将我的角度应用程序放在哪里 我使用 Rails 框架作为后端 我看过教程 其中整个角度应用程序都位于 asset javascript 文件夹下 我想知道是否可以让它完全位于我的ra
  • Tailwind CSS:有没有办法定位下一个兄弟?

    我有一个带有如下标签的无线电输入 输入被隐藏 标签用于制作一个视觉上吸引人的圆圈供用户单击
  • receiveCompletion 出错时订阅取消

    在我的以 MVVM 模式设计的应用程序中 我有一个登录视图 如果存在网络或身份验证问题 登录可能会失败 我的目标是捕获错误并显示相应的警报 我为警报定义了枚举 如下所示 enum Alerts Identifiable var id Int
  • Application Insights 是否跟踪引荐来源网址?

    我想我到处查看和搜索 但找不到任何带有推荐流量数据的图表或报告 我使用的是在预览 Azure 门户中存储数据的最新版本 在旧的应用程序洞察中 即在 VS Online 中 有此数据 有谁知道在新门户中是否可以找到它以及在哪里可以找到它 提前
  • Centos 7 Postgres 服务的环境变量

    最近我遇到了使用自定义 PGDATA 路径启动 postgresql 服务的问题 它尝试查找未初始化的默认数据目录 var lib pgsql 9 3 data 因此触发了这些错误 问题似乎是 Centos 7 上的服务启动器删除了所有环境
  • 如何在 Android 上将文件从内部应用程序存储移动/重命名到外部存储?

    我正在从互联网下载文件并将流数据保存到我的应用程序内部存储中的临时文件中获取文件目录 http developer android com reference android content Context html getFilesDir
  • IllegalArgumentException:类 TestDatabaseAutoConfiguration$EmbeddedDataSourceFactoryBean 中没有可见的构造函数

    我正在尝试使用 h2 数据库为 Spring Boot JPA 应用程序编写集成测试 不知何故 TestEntityManager 没有被创建 我尝试在论坛上寻找一些帮助 但找不到任何相关信息 感谢任何人可以提供帮助或提供一些指导 Than
  • 将 wc 行附加到文件名

    标题说明了一切 我已经设法得到这样的行 lines wc file txt awk print 1 但我可以使用辅助功能将其附加到文件名中 向我展示如何循环遍历当前目录中的所有 txt 文件的奖励积分 find name txt execd
  • 在 mac、ios、linux 上使用 calibri 风格

    由于 Windows 操作系统中存在 calibri 样式 但 linux mac ios 中不存在 calibri 样式 如果我的项目仅在 calibri 中具有其样式 并且我必须严格使用它 那么如果用户使用linux 并运行我的项目 那
  • 在android中使用Geocoder获取地址

    我尝试通过提供静态地理坐标来获取特定位置的地址 我无法获取地址 有人可以帮忙吗 我只需要检查这个功能是否适合我 这是我的片段 Geocoder geocoder new Geocoder AddressSimulator this Loca
  • 如何使用 docker-compose 将环境变量设置到 docker 容器中

    我想设置凭据以使用 Google Translate Api 客户端 因此我必须设置环境变量GOOGLE APPLICATION CREDENTIALS该值是凭证文件的路径 来自 Google Cloud 当我被利用的时候docker bu
  • 将未知长度的 char** (c) 转换为 vector (c++) [重复]

    这个问题在这里已经有答案了 如何将 C char 转换为 C 矢量 是否有一些内置功能可以用来做到这一点 或者通过一系列迭代步骤来完成它是否更好 编辑 由于各种原因 C 数组中的元素数量未知 我可以将其作为另一个参数传递 但这绝对有必要吗
  • 如何在反应中使用复选框形式?

    有两个组件container and presenter 下面的代码显示单个复选框状态变为 true 并且另一个复选框也正在更新 那么 如何处理具有状态的多个复选框 容器 export default class ApplyFormCont
  • 为什么点击设置innerHTML会在Chrome上触发两个解析事件?

    使用Chrome开发者工具中的时间轴 我使用了这一小段代码来记录事件内部HTML
  • 如何分发 Android 库

    我一直在为 android 库项目旋转一个 jar 并将这个 jar 包含在我的其他应用程序中 但在developer android com上 http developer android com tools projects index
  • REST API 404:URI 错误或缺少资源?

    我正在构建 REST API 但遇到了问题 设计 REST API 时公认的做法似乎是 如果请求的资源不存在 则返回 404 然而 对我来说 这增加了不必要的歧义 传统上 HTTP 404 与错误的 URI 相关 所以实际上我们是说 要么你
  • 将 ILMerge 与 .NET 4 库结合使用

    两个问题 1 基本 NET 程序集不包含在 ILMerged 程序集中 从 NET 3 5 Visual Studio 2008 升级到 NET 4 Visual Studio 2010 后 我在构建后使用 ILMerge 时遇到问题 我有