NullableAttribute 在另一个模块中声明,需要导入 - ILRepack

问题描述

所以我使用 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 (将#修改为@)