このトピックには多くの返信があることは知っていますが、この返信で見つけたサンプル コードは、.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>