(BuildAction: Embedded Resource を介して) 参照されたアセンブリ (ClassLibrary1 と呼ばれる) を内部に埋め込み、それを AppDomain.CurrentDomain.AssemblyResolve イベントにロードするアプリケーションがあります。メイン アセンブリはクラス Class1 を定義します。
public class Class1
{
public Class2 MyField { get; set; }
}
ClassLibrary1 で定義された Class2 型のプロパティがあります。Class2 の定義:
public class Class2
{
public int A { get; set; }
}
メイン メソッドでは、新しい XmlSerializer(typeof(Class1)) を作成しています。
static void Main()
{
SubscribeAssemblyResolver();
MainMethod();
}
private static void MainMethod()
{
XmlSerializer xs2 = new XmlSerializer(typeof(Class1));
Class1 cl = new Class1();
}
プログラムの実行中に、次のエラーが発生します。
一時クラスを生成できません (結果 = 1)。エラー CS0012: 型 'ClassLibrary1.Class2' は、参照されていないアセンブリで定義されています。アセンブリ 'ClassLibrary1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=c06f123f2868e8c8' への参照を追加する必要があります。エラー CS0266: 型 'object' を 'ClassLibrary1.Class2' に暗黙的に変換することはできません。明示的な変換が存在します (キャストがありませんか?)
何か案は?
コードの残りの部分:
private static void SubscribeAssemblyResolver()
{
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
}
static Dictionary<String, Assembly> _assemblies = new Dictionary<String, Assembly>(StringComparer.OrdinalIgnoreCase);
static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
return ResolveAssembly(args.Name);
}
private static Assembly ResolveAssembly(string argsName)
{
Assembly dll;
var name = "WindowsFormsApplication1.Libs." + new AssemblyName(argsName).Name + ".dll";
if (!_assemblies.TryGetValue(name, out dll))
{
Assembly res = typeof(Program).Assembly;
using (var input = res.GetManifestResourceStream(name))
{
if (input == null)
{
//TODO: log
return null;
}
Byte[] assemblyData = new Byte[input.Length];
input.Read(assemblyData, 0, assemblyData.Length);
if (null == (dll = Assembly.Load(assemblyData)))
{
//TODO: log
return null;
}
//TODO: log
_assemblies[name] = dll;
return dll;
}
}
return dll;
}
更新: Microsoft Connect サイトにバグを作成しました。サンプルの Visual stuido 2010 ソリューション (詳細フィールドグループを展開するだけ) をダウンロードして再現することもできます。