ILRepack.Lib.MSBuild.Task icon indicating copy to clipboard operation
ILRepack.Lib.MSBuild.Task copied to clipboard

Release configuration merge gives error failed to resolve assembly

Open chiragknzariya opened this issue 4 years ago • 11 comments

Hello @ravibpatel

I have created a new C# project and used ILRepack.Lib.MSBuild.Task.2.0.18.1 and added below code in my project .csproj file and it works absolutely fine, but when I add earlybound class file ([assembly: Microsoft.Xrm.Sdk.Client.ProxyTypesAssemblyAttribute()]) to my project It gives below error.

What do you think could be the problem? Can you please share the solution of the problem?

<Import Project="..\packages\ILRepack.Lib.MSBuild.Task.2.0.18.1\build\ILRepack.Lib.MSBuild.Task.targets" Condition="Exists('..\packages\ILRepack.Lib.MSBuild.Task.2.0.18.1\build\ILRepack.Lib.MSBuild.Task.targets')" /> <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild"> <PropertyGroup> <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText> </PropertyGroup> <Error Condition="!Exists('..\packages\ILRepack.Lib.MSBuild.Task.2.0.18.1\build\ILRepack.Lib.MSBuild.Task.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\ILRepack.Lib.MSBuild.Task.2.0.18.1\build\ILRepack.Lib.MSBuild.Task.targets'))" /> </Target>

1> D365.Plugins -> C:\Users\admin\source\repos\D365.Plugins\D365.Plugins\bin\Release\D365.Plugins.dll 1> Added assembly 'bin\Release\Microsoft.Crm.Sdk.Proxy.dll' 1> Added assembly 'bin\Release\microsoft.identitymodel.dll' 1> Added assembly 'bin\Release\Microsoft.ServiceBus.dll' 1> Added assembly 'bin\Release\Microsoft.Xrm.Client.CodeGeneration.dll' 1> Added assembly 'bin\Release\Microsoft.Xrm.Client.dll' 1> Added assembly 'bin\Release\Microsoft.Xrm.Portal.dll' 1> Added assembly 'bin\Release\Microsoft.Xrm.Portal.Files.dll' 1> Added assembly 'bin\Release\Microsoft.Xrm.Sdk.Deployment.dll' 1> Added assembly 'bin\Release\Microsoft.Xrm.Sdk.dll' 1> Merging 9 assembies to 'bin\Release\D365.Plugins.dll' 1>C:\Users\admin\source\repos\D365.Plugins\packages\ILRepack.Lib.MSBuild.Task.2.0.18.1\build\ILRepack.Lib.MSBuild.Task.targets(19,5): error : Failed to resolve assembly: 'Microsoft.Xrm.Sdk, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

chiragknzariya avatar Sep 22 '20 12:09 chiragknzariya

Awaiting for your response @ravibpatel

chiragknzariya avatar Sep 25 '20 06:09 chiragknzariya

You can try manually providing targets file this way you can manually add all the assemblies you want to merge. You can do it as shown here.

ravibpatel avatar Sep 25 '20 06:09 ravibpatel

Thanks for your response @ravibpatel.

I have already used your example targets file and provided manually in project.

ILRepack.targets

Still it complaints for the same.

chiragknzariya avatar Sep 25 '20 08:09 chiragknzariya

You can try adding binding redirects as shown in this article. Also, I don't see "Microsoft.Xrm.Sdk.dll" in targets file which should contain the "Microsoft.Xrm.Sdk". If it still doesn't work then embedding may work better than merging in this case. You can try Costura.Fody to embed dll's inside your executable.

ravibpatel avatar Sep 25 '20 08:09 ravibpatel

I'm able to reproduce this issue using the code in this repo: https://github.com/icnocop/ILRepackBug

  1. Clone repo
  2. Open ConsoleApp.sln in Visual Studio 2019
  3. Build

Notice the build fails with the following output:

...
1>Target Build:
1>Target ILRepacker:
1>  Using "ILRepack" task from assembly "C:\Users\username\.nuget\packages\ilrepack.lib.msbuild.task\2.0.18.2\build\ILRepack.Lib.MSBuild.Task.dll".
1>  Task "ILRepack"
1>    Added assembly 'bin\Debug\net472\ClassLibrary.dll'
1>    Added assembly 'bin\Debug\net472\Microsoft.Practices.EnterpriseLibrary.Common.dll'
1>    Added assembly 'bin\Debug\net472\Microsoft.Practices.EnterpriseLibrary.Logging.dll'
1>    Merging 3 assembies to 'bin\Debug\net472\\ConsoleApp.dll'
1>    E:\github\icnocop\ILRepackBug\ConsoleApp\ILRepack.targets(9,9): error : Failed to resolve assembly: 'Microsoft.Practices.EnterpriseLibrary.Common, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'
1>  Done executing task "ILRepack" -- FAILED.
1>Done building target "ILRepacker" in project "ConsoleApp.csproj" -- FAILED.
1>
1>Done building project "ConsoleApp.csproj" -- FAILED.
1>
1>Build FAILED.

Any ideas?

Thank you.

icnocop avatar Jun 11 '21 21:06 icnocop

+1 ☝️ Experiencing the exact same issue

IvayloD avatar Sep 19 '21 12:09 IvayloD

I had a similar problem trying to merge Newtonsoft.Json.dll when using a property attribute (removing the attribute allowed the merge). My solution was to add LibraryPath="$(OutputPath)" to the ILRepack element in the ILRepack.targets file

HughJeffner avatar Oct 27 '21 13:10 HughJeffner

Same issue here. It will pack the dlls not listed in the InputAssemblies.

andy840119 avatar Feb 22 '22 11:02 andy840119

I am now experiencing this issue that was originally stated. I have two items in my ItemGroup <ItemGroup> <InputAssemblies Include="$(OutputPath)Newtonsoft.Json.dll" /> <InputAssemblies Include="$(OutputPath)Pricing_Plugin.dll" /> </ItemGroup>

but i see all 13 .dll files being merged. image

It was working before and now all of a sudden im having issues with getting my Microsoft.Xrm.Sdk to work

Error: Failed to resolve assembly: 'Microsoft.Xrm.Sdk, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'

TomT15 avatar Sep 26 '22 19:09 TomT15

I had this issue and I believe the fix was adding an inputassemblies reference in ILRepack.targets. Please note the expandable ReferencePathWithRefAssemblies inclusion. Just add the file name and exclude the .dll (file type). This fix was taken from https://www.meziantou.net/merging-assemblies-using-ilrepack.htm

  <ItemGroup>
      <InputAssemblies Include="$(TargetPath)"/>
      <InputAssemblies Include="@(ReferencePathWithRefAssemblies)" Condition="'%(filename)' == 'Newtonsoft.Json'" />
      <InputAssemblies Include="@(ReferencePathWithRefAssemblies)" Condition="'%(filename)' == 'Microsoft.Xrm.Sdk.Workflow'" />
      <InputAssemblies Include="@(ReferencePathWithRefAssemblies)" Condition="'%(filename)' == 'Microsoft.Xrm.Sdk'" />
      <InputAssemblies Include="@(ReferencePathWithRefAssemblies)" Condition="'%(filename)' == 'Microsoft.Crm.Sdk.Proxy'" />
      <InputAssemblies Include="$(OutputPath)\MyAssembly.dll" />
    </ItemGroup>

chocataw avatar Jan 29 '23 13:01 chocataw

In my case (.NET Standard 2.0 library) I had to specify LibraryPath like this:

<?xml version="1.0" encoding="utf-8" ?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <Target Name="ILRepacker" AfterTargets="Build">
    <ItemGroup>
      <InputAssemblies Include="$(TargetPath)"/>
      <InputAssemblies Include="@(ReferencePathWithRefAssemblies)" Condition="'%(filename)' == 'IndexRange'" />
      <LibraryPath Include="%(ReferencePathWithRefAssemblies.RelativeDir)" />
    </ItemGroup>

    <ILRepack
      AllowDuplicateResources="false"
      DebugInfo="true"
      Internalize="true"
      InputAssemblies="@(InputAssemblies)"
      LibraryPath="@(LibraryPath)"
      OutputFile="$(TargetPath)"
      Parallel="true"
      TargetKind="SameAsPrimaryAssembly" />
  </Target>
</Project>

This way I do not need to have NuGet dependencies to be copied to the output directory.

DarkDaskin avatar Mar 26 '24 06:03 DarkDaskin