4

我知道这个主题有很多回复,但是我在这个回复中找到的示例代码不适用于每个 .dll

我用了这个例子。

public App()
    {
        AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(ResolveAssembly);
    }

    static Assembly ResolveAssembly(object sender, ResolveEventArgs args)
    {
        //We dont' care about System Assemblies and so on...
        if (!args.Name.ToLower().StartsWith("wpfcontrol")) return null;

        Assembly thisAssembly = Assembly.GetExecutingAssembly();

        //Get the Name of the AssemblyFile
        var name = args.Name.Substring(0, args.Name.IndexOf(',')) + ".dll";

        //Load form Embedded Resources - This Function is not called if the Assembly is in the Application Folder
        var resources = thisAssembly.GetManifestResourceNames().Where(s => s.EndsWith(name));
        if (resources.Count() > 0)
        {
            var resourceName = resources.First();
            using (Stream stream = thisAssembly.GetManifestResourceStream(resourceName))
            {
                if (stream == null) return null;
                var block = new byte[stream.Length];
                stream.Read(block, 0, block.Length);
                return Assembly.Load(block);
            }
        }
        return null;
    }

当我创建一个只有一个窗口和一个按钮的小程序时,它可以工作,但是使用我的“大”dll 它没有工作。“大” dll 上的设置与我的小程序中的设置相同。

我无法想象为什么它有时会起作用,有时却不起作用。我也用 ICSharp.AvalonEdit.dll 对其进行了测试,但不成功..

谁能想象错误在哪里?

编辑 1

当我启动我的程序时,它说它找不到我的 dll。

编辑 2

我想我得到了问题的核心。如果我要合并的其中一个 dll 包含对另一个 dll 的引用,那么我将成为此FileNotFoundException异常。有人知道如何加载/添加内部所需的 dll

编辑 3

当我使用 Jiří Polášek 的代码时,它适用于某些人。我的Fluent显示错误“请附上带有样式的 ResourceDictionary。但我已经在我的App.xaml

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/Fluent;Component/Themes/Office2010/Silver.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources> 
4

1 回答 1

1

如果您引用的程序集需要其他程序集,您还必须将它们包含在您的应用程序中 - 无论是在应用程序文件夹中还是作为嵌入式资源。您可以使用 Visual Studio、IL Spy、dotPeek 确定引用的程序集,或使用方法编写您自己的工具Assembly.GetReferencedAssemblies

在您将处理程序附加到它之前,该事件也可能AssemblyResolve被触发ResolveAssembly。附加处理程序应该是您在 Main 方法中做的第一件事。在 WPF 中,您必须使用新的 Main 方法创建新类,并将其设置为项目设置中的Startup 对象

public class Program
{
    [STAThreadAttribute]
    public static void Main()
    {
        AppDomain.CurrentDomain.AssemblyResolve
            += new ResolveEventHandler(ResolveAssembly);
        WpfApplication1.App app = new WpfApplication1.App();
        app.InitializeComponent();
        app.Run();
    }

    public static Assembly ResolveAssembly(object sender, ResolveEventArgs args)
    {   
      // check condition on the top of your original implementation
    }
}

您还应该检查顶部的保护条件,ResolveAssembly以不排除任何引用的程序集。

于 2013-08-03T10:20:05.070 回答