pardeike / Harmony

A library for patching, replacing and decorating .NET and Mono methods during runtime
https://www.patreon.com/pardeike
MIT License
5.15k stars 485 forks source link

NuGet Package reference assembly conflict #573

Closed jichulu closed 7 months ago

jichulu commented 7 months ago

Describe the bug .NET 8 compile error with 2.3.0-prerelease.7

To Reproduce Steps to reproduce the behavior:

internal class Class1
{
    public Class1()
    {
        var harmony = new HarmonyLib.Harmony("xxx");
        var memory = new System.ReadOnlyMemory<string>();//Throw cs0433 error
    }
}

Expected behavior no error

Screenshots / Code Error CS0433 The type "ReadOnlyMemory<T>" exists in both "0Harmony, Version=2.3.0.0, Culture=neutral, PublicKeyToken=null" and "System.Runtime, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"

Runtime environment (please complete the following information):

Additional context This may be due to a misdefined reference assembly, duplicating the System namespace Location in NuGet package: "\2.3.0-prerelease.7\ref\netstandard2.0\0Harmony.dll"

pardeike commented 7 months ago

Please try cloning master, then choose HarmonyFat and right click Harmony project and choose Pack. Use the NuGet package that builds in Harmony/bin locally (point your own projects nuget settings to its directory as an extra nuget source and move it up in priority) or use the 0Harmony.dll in the corresponding .net version folder.

The master contains changes on how dependencies are internalized. If that does not solve your problem you can try the existing Lib.Harmony.Thin nuget package and supply all dependencies yourself.

Let me know if this solves your problem. I am about to release Harmony and the way it’s build is currently actively discussed on the official discord (beta channel).

jichulu commented 7 months ago

Looks like the latest version has been fixed.

image

pardeike commented 7 months ago

Is the screenshot from Thin or Fat?

jichulu commented 7 months ago

Is the screenshot from Thin or Fat?

Both. image

pardeike commented 7 months ago

My question is: which, fat or thin, did solve your problem?

jichulu commented 7 months ago

My problem occurs in version 2.3.0-prerelease.7. clone code from GitHub can solve the CS0433 error thrown during compilation. But when running the program, the Mono.Cecil reference cannot be found. When switched to ReleaseFat mode to compile, but the compilation failed: ILRepack.targets error : Failed to resolve System.Reflection.BindingFlags. After consulting the information about ILRepack, I learned that it is a tool for merging 3rd dlls. Considering that its behavior is to merge through IL reorganization, there may be a risk of damaging related 3rd dlls. So I used the NuGet package Costura.Fody instead. After compilation, referenced the local NuGet package and runs OK. The relevant changes are as follows:

<PropertyGroup Condition="'$(Configuration)'=='DebugThin' Or '$(Configuration)'=='ReleaseThin'">
    <!-- Disable to merge external dll -->
    <DisableFody>true</DisableFody>
</PropertyGroup>

<ItemGroup>
    <PackageReference Include="Costura.Fody" Version="5.7.0" PrivateAssets="all"/>
    <PackageReference Include="MonoMod.Core" Version="$(MonoModCoreVersion)" PrivateAssets="all" />
    <!-- Reference assemblies are needed for non-Windows .NET Framework targeting builds. -->
    <PackageReference Include="Microsoft.NETFramework.ReferenceAssemblies" Version="1.0.3" PrivateAssets="all" />
</ItemGroup>

The first part of the PropertyGroup configuration is used to prohibit merging third-party dlls in thin mode. The second part is to remove ILRepacker and use Costura.Fody instead. Costura.Fody packages third-party dlls as embedded resources and loads them at runtime. This approach will not change third-party dlls, especially signed dlls.

pardeike commented 6 months ago

Costura.Fody has a very questionable license model so I rather not want to use it.

pardeike commented 6 months ago

@jichulu You should try master instead of prerelease 7