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;
    }

ウィンドウが 1 つとボタンが 1 つしかない小さなプログラムを作成したときは動作しましたが、「大きな」DLL では動作しませんでした。「大きな」dll の設定は、私の小さなプログラムの設定と同じです。

なぜそれが時々うまくいくのか、時々うまくいかないのか想像できません。私もICSharp.AvalonEdit.dllでテストしましたが、失敗しました..

エラーがどこにあるのか誰でも想像できますか?

編集 1

プログラムを起動すると、dll が見つからないというメッセージが表示されます。

編集 2

私は私の問題の核心を得たと思います。マージしたいdllの1つに他の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 に答える