CRM 使用 ILMerge 将框架库与插件项目合并
CRM using ILMerge to merge framework library with plugin projects
我有两个程序集:
- 主要插件程序集 - 用于我的项目的插件
- 框架程序集 - 我想将这个程序集与主插件合并,这样我就可以重用一些在不同项目中经常使用的常用方法。
我在主插件程序集上安装了 ILMerge 并引用了构建的框架 dll,同时在解决方案上设置了项目构建顺序。
现在,在我部署之前这看起来没问题。当我尝试使用我的单元测试项目进行调试时,主要问题出现了。
在我的单元测试项目中,我引用了主插件程序集,它允许我使用 fakexrmeasy 运行 我的单元测试。但是,既然程序集已经合并,我希望我应该能够在我的单元测试项目中使用框架方法。在测试 类.
中引用主要插件程序集时,我似乎无法访问这些方法
上述所有项目都存在于同一个解决方案中。
我是 ILMerge 的新手,所以可能做错了一些非常明显的错误。我只是使用内置的 visual studio 编译器进行编译。
任何人都可以提出可能出了什么问题吗?
首先,我的建议是使用 ILRepack,因为 ILMerge 不再被积极维护。 ILRepack 基于 ILMerge 并且是开源的。将 NuGet 包 ILRepack.Lib.MSBuild.Task
添加到您的项目。
然后将这个文件添加到你的项目中并命名为ILRepack.targets
:
<?xml version="1.0" encoding="utf-8" ?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="ILRepacker" AfterTargets="Build">
<ItemGroup>
<InputAssemblies Include="$(OutputPath)$(TargetName)$(TargetExt)" />
<InputAssemblies Include="$(OutputPath)YourFramework.dll" />
</ItemGroup>
<ILRepack
Parallel="true"
Internalize="false"
InternalizeExclude="@(DoNotInternalizeAssemblies)"
InputAssemblies="@(InputAssemblies)"
LibraryPath="$(OutputPath)"
Wildcards="false"
TargetKind="SameAsPrimaryAssembly"
DebugInfo="false"
KeyFile="YourCompany.snk"
OutputFile="$(OutputPath)Merged$(AssemblyName).dll"
LogFile="$(OutputPath)Merged\ILRepack.log"
/>
</Target>
</Project>
请注意,根据此配置,您的合并 dll 是在名为“Merged”的单独文件夹中创建的。这是您在 Dynamics 365 上注册的库。您的单元测试应该只使用插件项目的常规生成输出。
只要您拥有框架程序集的所有代码,一种选择就是使用 Visual Studio Shared Project.
将框架代码放入共享项目将使您无需任何其他工具即可将插件和框架代码编译到单个程序集中。
在 this answer 中,我介绍了我通常如何使用共享项目使插件逻辑可从 testing/debugging 的插件程序集和控制台应用程序访问。
另一种选择是将框架源文件 as links 添加到插件项目。
我有两个程序集:
- 主要插件程序集 - 用于我的项目的插件
- 框架程序集 - 我想将这个程序集与主插件合并,这样我就可以重用一些在不同项目中经常使用的常用方法。
我在主插件程序集上安装了 ILMerge 并引用了构建的框架 dll,同时在解决方案上设置了项目构建顺序。
现在,在我部署之前这看起来没问题。当我尝试使用我的单元测试项目进行调试时,主要问题出现了。
在我的单元测试项目中,我引用了主插件程序集,它允许我使用 fakexrmeasy 运行 我的单元测试。但是,既然程序集已经合并,我希望我应该能够在我的单元测试项目中使用框架方法。在测试 类.
中引用主要插件程序集时,我似乎无法访问这些方法上述所有项目都存在于同一个解决方案中。
我是 ILMerge 的新手,所以可能做错了一些非常明显的错误。我只是使用内置的 visual studio 编译器进行编译。
任何人都可以提出可能出了什么问题吗?
首先,我的建议是使用 ILRepack,因为 ILMerge 不再被积极维护。 ILRepack 基于 ILMerge 并且是开源的。将 NuGet 包 ILRepack.Lib.MSBuild.Task
添加到您的项目。
然后将这个文件添加到你的项目中并命名为ILRepack.targets
:
<?xml version="1.0" encoding="utf-8" ?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="ILRepacker" AfterTargets="Build">
<ItemGroup>
<InputAssemblies Include="$(OutputPath)$(TargetName)$(TargetExt)" />
<InputAssemblies Include="$(OutputPath)YourFramework.dll" />
</ItemGroup>
<ILRepack
Parallel="true"
Internalize="false"
InternalizeExclude="@(DoNotInternalizeAssemblies)"
InputAssemblies="@(InputAssemblies)"
LibraryPath="$(OutputPath)"
Wildcards="false"
TargetKind="SameAsPrimaryAssembly"
DebugInfo="false"
KeyFile="YourCompany.snk"
OutputFile="$(OutputPath)Merged$(AssemblyName).dll"
LogFile="$(OutputPath)Merged\ILRepack.log"
/>
</Target>
</Project>
请注意,根据此配置,您的合并 dll 是在名为“Merged”的单独文件夹中创建的。这是您在 Dynamics 365 上注册的库。您的单元测试应该只使用插件项目的常规生成输出。
只要您拥有框架程序集的所有代码,一种选择就是使用 Visual Studio Shared Project.
将框架代码放入共享项目将使您无需任何其他工具即可将插件和框架代码编译到单个程序集中。
在 this answer 中,我介绍了我通常如何使用共享项目使插件逻辑可从 testing/debugging 的插件程序集和控制台应用程序访问。
另一种选择是将框架源文件 as links 添加到插件项目。