如果文件夹?/中没有特定的dll's,则无法运行工具包

本文关键字:工具包 运行 dll 文件夹 如果 | 更新日期: 2023-09-27 18:10:32

我是一个编程新手,希望能得到一些帮助。我刚刚安装了MahApps。地铁,它看起来真的很漂亮。但是如果没有system . windows . interactive . DLL和MahApps.Metro.dll在同一文件夹中,我无法运行程序,如果我尝试在没有这两个DLL的情况下运行它,它只是…不开。有没有一种方法来合并这些DLL的exe或只是运行它没有他们?

提前感谢您的帮助!

如果文件夹?/中没有特定的dll's,则无法运行工具包

您可以使用ILMerge (http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=17630)。

使用ILMerge可以合并所有程序集(文件夹中的所有dll)到,例如一个exe文件。请看下面的解释:http://research.microsoft.com/en-us/people/mbarnett/ILMerge.aspx

但是你部署所有程序集的问题是什么?我认为这是很常见的。

如果没有使用这些程序集,则无法运行应用程序。毕竟,您使用的代码只存在于这些程序集中,如果应用程序除了关闭之外没有找到所需的代码,该怎么办?

但是有一种方法可以将程序集嵌入到你的exe中,所以你只需要重新分发一个文件。可以将引用的程序集添加为嵌入式资源(将dll添加到项目中并将其"Build Action"设置为"Embedded Resource")并从那里加载。

您需要在当前AppDomainAppDomain.AssemblyResolve事件中自己加载它。为此,您需要向该事件添加一个处理程序,如下所示:

AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => {
    String resourceName = 
        "YourDefaultNameSpace." + 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);
    }
};

对于WPF应用程序,你可以覆盖app . onstartup(在App.xaml.cs中)并添加到那里:

protected override void OnStartup(StartupEventArgs e) {
    base.OnStartup(e);
    // ---- Add the handler code here ----
}

原始来源和更多细节:
Jeffrey Richter: CLR via c#第三版节选#2