使用Fody Mono支持将dll嵌入到exe中

时间:2018-05-29 11:48:32

标签: c# .net winforms mono fody

我的问题几乎与 Embedding DLLs in a compiled executable 相似,但是提供的非常好的答案here会失去与mono运行时的兼容性,尽管它可以在Windows上运行。

那么我如何使用FodyCostura)并保持单声道兼容性。他们在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'

1 个答案:

答案 0 :(得分: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/