ravibpatel / ILRepack.Lib.MSBuild.Task

MSBuild task for ILRepack which is an open-source alternative to ILMerge.
Other
101 stars 29 forks source link

Release configuration merge gives error failed to resolve assembly #26

Open chiragknzariya opened 3 years ago

chiragknzariya commented 3 years ago

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?

`

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}. ` 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 commented 3 years ago

Awaiting for your response @ravibpatel

ravibpatel commented 3 years ago

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.

chiragknzariya commented 3 years ago

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.

ravibpatel commented 3 years ago

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.

icnocop commented 3 years ago

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.

IvayloD commented 2 years ago

+1 ☝️ Experiencing the exact same issue

HughJeffner commented 2 years ago

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

andy840119 commented 2 years ago

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

TomT15 commented 1 year ago

I am now experiencing this issue that was originally stated. I have two items in my 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'

chocataw commented 1 year ago

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>
DarkDaskin commented 4 months ago

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.