4

好吧,我的问题几乎类似于在已编译的可执行文件中嵌入 DLL,这里提供的非常好的答案失去了与单声道运行时的兼容性,尽管它适用于 Windows。

那么我如何使用Fody( Costura) 并保持单声道兼容性。他们在https://github.com/Fody/Costura#contents的文档如下:

CosturaUtility 是一个类,可让您在自己的代码中手动初始化 Costura 系统。这主要是针对模块初始化器不起作用的场景,例如库和 Mono。

要使用,请尽早在代码中的某处调用 CosturaUtility.Initialize()。

class Program {
    static Program() {
        CosturaUtility.Initialize();
    }

    static void Main(string[] args) { ... }
}

但即使在ConturaUtility手动初始化之后,它也不支持单声道运行时。

我不认为错误日志是相关的,但它是:

Unhandled Exception:
System.IO.FileNotFoundException: Could not load file or assembly 'CommandLine, Version=2.2.1.0, Culture=neutral, PublicKeyToken=de6f01bd326f8c32' or one of its dependencies.
File name: 'CommandLine, Version=2.2.1.0, Culture=neutral, PublicKeyToken=de6f01bd326f8c32'
[ERROR] FATAL UNHANDLED EXCEPTION: System.IO.FileNotFoundException: Could not load file or assembly 'CommandLine, Version=2.2.1.0, Culture=neutral, PublicKeyToken=de6f01bd326f8c32' or one of its dependencies.
File name: 'CommandLine, Version=2.2.1.0, Culture=neutral, PublicKeyToken=de6f01bd326f8c32'
4

1 回答 1

0

在程序的 Main() 开头使用此代码:

AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => {
   String resourceName = "AssemblyLoadingAndReflection." +
      new AssemblyName(args.Name).Name + ".dll";
   using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)) {
      Byte[] assemblyData = new Byte[stream.Length];
      stream.Read(assemblyData, 0, assemblyData.Length);
      return Assembly.Load(assemblyData);
   }
};

参考:https ://blogs.msdn.microsoft.com/microsoft_press/2010/02/03/jeffrey-richter-excerpt-2-from-clr-via-c-third-edition/

于 2018-12-30T00:34:52.457 回答