このトピックへの返信がたくさんあることは知っていますが、この返信で見つけたサンプルコードは、各.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でもテストしましたが、失敗しました。
誰かがエラーがどこにあるか想像できますか?
プログラムを起動すると、dllが見つからないと表示されます。
私は自分の問題の核心をつかんだと思います。マージしたいdllの1つに、他のdllへの参照が含まれている場合、このFileNotFoundException
例外になります。誰かが内部の必要なdllもロード/追加する方法を知っていますか
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>
参照するアセンブリで他のアセンブリが必要な場合は、それらをアプリケーションに含める必要があります(アプリケーションフォルダーまたは埋め込みリソースとして)。Visual Studio、IL Spy、dotPeekを使用して参照されるアセンブリを決定するか、メソッドを使用して独自のツールを作成できますAssembly.GetReferencedAssemblies
。
ハンドラーをAssemblyResolve
アタッチする前にイベントが発生する可能性もありますResolveAssembly
。Mainメソッドで最初に行うのは、ハンドラーのアタッチです。WPFでは、新しいMainメソッドを使用して新しいクラスを作成し、プロジェクト設定でスタートアップオブジェクトとして設定する必要があります。
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
、参照されているアセンブリを除外しないように、上部のガード条件を確認する必要があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加