没有文件夹中的某些dll,无法运行工具包?/

时间:2013-04-24 06:30:11

标签: c# wpf

我是编程新手,非常喜欢帮助。我刚刚安装了MahApps.Metro,它看起来非常漂亮和漂亮。但是我没有System.Windows.Interactivity.dll和MahApps.Metro.dll在同一个文件夹中运行该程序,如果我尝试运行它没有那两个DLL它只是..没有打开。有没有办法将这些DLL合并到exe中,或者只是在没有它的情况下运行它?

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

您可以使用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

但是,部署所有程序集的问题是什么?我认为这些日子非常普遍。

答案 1 :(得分:0)

如果使用这些程序集,则无法运行应用程序。毕竟,您正在使用仅在这些程序集中的代码,如果除了shutdown之外没有找到所需的代码,您的应用程序应该怎么做?

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

然后,您需要在当前AppDomain.AssemblyResolveAppDomain事件中自行加载。为此,您需要为此事件添加一个处理程序,如下所示:

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: Excerpt #2 from CLR via C#, Third Edition