问题描述
所以我使用 ILRepack,据我所知,它在幕后使用 Mono.Cecil 来做 ILWeaving。我在我的项目中遇到了一个问题,一旦我导入,就会导致以下错误,例如 Newtonsoft.Json 版本 13.0.1:
INFO: Writing output assembly to disk
System.ArgumentException: Member 'System.Void System.Runtime.CompilerServices.NullableAttribute::.ctor(System.Byte)' is declared in another module and needs to be imported
at Mono.Cecil.MetadataBuilder.LookupToken(IMetadataTokenProvider provider)
at Mono.Cecil.MetadataBuilder.AddCustomAttributes(ICustomAttributeProvider owner)
at Mono.Cecil.MetadataBuilder.AddConstraints(GenericParameter generic_parameter,GenericParamConstraintTable table)
at Mono.Cecil.MetadataBuilder.AddGenericParameters()
at Mono.Cecil.MetadataBuilder.BuildTypes()
at Mono.Cecil.MetadataBuilder.BuildModule()
at Mono.Cecil.MetadataBuilder.BuildMetadata()
at Mono.Cecil.ModuleWriter.BuildMetadata(ModuleDeFinition module,MetadataBuilder Metadata)
at Mono.Cecil.ModuleWriter.Write(ModuleDeFinition module,disposable`1 stream,WriterParameters parameters)
at Mono.Cecil.ModuleWriter.WriteModule(ModuleDeFinition module,WriterParameters parameters)
at Mono.Cecil.ModuleDeFinition.Write(String fileName,WriterParameters parameters)
at Mono.Cecil.AssemblyDeFinition.Write(String fileName,WriterParameters parameters)
at ILRepacking.ILRepack.Repack()
at ILRepack.Lib.Task.ILRepack.Execute()
我所做的只是将其添加为 packagereference,在发布模式下构建时,我收到此错误。
我意识到错误消息非常具体,但经过数小时的尝试解决此问题后,我一直无法解决。我最大的问题是我不知道“另一个模块”的确切含义。
这是一个完全空的项目,除了使用 ILRepack 包并导入 Newtonsoft.Json。
它针对 netstandard2.0
,我需要将其作为目标。由于......原因,我无法将其更改为更新版本。
在没有 Newtonsoft.Json 的情况下以发布模式构建工作。
它也可以在调试中构建,其中 ILRepack 不执行。
所以这意味着必要的属性必须存在,否则它不会在调试中编译,对吗?
我尝试在我的项目中手动定义此属性,如下所示:
namespace System.Runtime.CompilerServices
{
[AttributeUsage(
AttributeTargets.Class |
AttributeTargets.Event |
AttributeTargets.Field |
AttributeTargets.GenericParameter |
AttributeTargets.Parameter |
AttributeTargets.Property |
AttributeTargets.ReturnValue,AllowMultiple = false,Inherited = false)]
public class NullableAttribute : Attribute
{
public readonly byte[] NullableFlags;
public NullableAttribute(byte flag)
{
NullableFlags = new byte[] { flag };
}
public NullableAttribute(byte[] flags)
{
NullableFlags = flags;
}
}
}
但即便如此,我还是收到了上述错误。那么 Mono.Cecil 在哪里寻找这个属性呢?为什么在我的项目中手动定义它甚至还不够?
我使用的 ILRepack 配置是这样的:
<Target Name="MergeTheThing" AfterTargets="build" Condition="$(Configuration.Contains('Release'))">
<ItemGroup>
<InputAssemblies Include="$(OutputPath)$(TargetName)$(TargetExt)" />
<InputAssemblies Include="$(OutputPath)*.dll" Exclude="$(OutputPath)$(TargetName)$(TargetExt)" />
</ItemGroup>
<ItemGroup>
<LibraryPath Include="$(OutputPath)" />
<LibraryPath Include="$(VINTAGE_STORY)/Lib/" />
</ItemGroup>
<ItemGroup>
<DonotinternalizeAssemblies Include="VintagestoryAPI.dll" />
<DonotinternalizeAssemblies Include="VintagestoryLib.dll" />
<DonotinternalizeAssemblies Include="VSSurvivalMod.dll" />
<DonotinternalizeAssemblies Include="VSEssentials.dll" />
<DonotinternalizeAssemblies Include="VSCreativeMod.dll" />
<DonotinternalizeAssemblies Include="Newtonsoft.Json.dll" />
<DonotinternalizeAssemblies Include="0Harmony.dll" />
<DonotinternalizeAssemblies Include="protobuf-net.dll" />
<DonotinternalizeAssemblies Include="System.Data.sqlite.dll" />
</ItemGroup>
<ILRepack Parallel="true"
DebugInfo="true"
Verbose="true"
Internalize="true"
InternalizeExclude="@(DonotinternalizeAssemblies)"
Wildcards="true"
InputAssemblies="@(InputAssemblies)"
LibraryPath="@(LibraryPath)"
KeyFile="$(AssemblyOriginatorKeyFile)"
TargetKind="SameAsPrimaryAssembly"
OutputFile="$(OutputPath)$(AssemblyName)$(TargetExt)"
LogFile="output.txt"/>
</Target>
我有哪些选项可以告诉 Mono.Cecil 去哪里寻找这个属性? 或者我可以以某种方式让它完全忽略该属性吗?我不需要使用它,我只需要它来正确编译即可。
有关日志文件,请参阅随附的 output.txt:
output.txt
在这个日志文件中,我还注意到它实际上导入了我手动定义的 NullableAttribute:Importing System.Runtime.CompilerServices.NullableAttribute from TestSolution4.dll
,但是为什么 Mono.Cecil 不直接使用这个呢?
非常感谢任何帮助!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)