我有embedes的應用程序:內部本身並裝入AppDomain.CurrentDomain.AssemblyResolve事件中引用組件(稱爲ClassLibrary1的)(經由BuildAction的嵌入的資源) 。 主組件定義了一類的Class1:錯誤反序列化對象具有裝載在AssemblyResolve
public class Class1
{
public Class2 MyField { get; set; }
}
它在ClassLibrary1的定義類型的Class2的屬性。等級2的 定義:
public class Class2
{
public int A { get; set; }
}
在main方法我真的創建一個新的XmlSerializer(typeof運算(1類)):
static void Main()
{
SubscribeAssemblyResolver();
MainMethod();
}
private static void MainMethod()
{
XmlSerializer xs2 = new XmlSerializer(typeof(Class1));
Class1 cl = new Class1();
}
當執行PROGRAMM我得到以下錯誤:
無法生成臨時類(結果= 1)。 錯誤CS0012:類型'ClassLibrary1.Class2'是在未引用的程序集中定義的。您必須添加對程序集'ClassLibrary1,版本= 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;
}
UPDATE:創建一個BUG在Microsoft Connect站點。您也可以從那裏下載示例視覺stuido 2010解決方案(只展開「詳細信息」字段組),以進行復制。
此錯誤不限於動態加載的程序集。請參見[在VB中的特定情況下創建XML序列化程序時出錯](https://connect.microsoft.com/VisualStudio/feedback/details/668950/error-creating-xml-serializer-in-specific-situation-in-vb)。不幸的是,除非它們對安全至關重要,否則XmlSerializer錯誤不會被修復。 – 2011-05-19 18:09:15
感謝您的鏈接,約翰!不幸的是,在上述錯誤的解決方法中指定的解決方案不適用於我的情況: XmlSerializer xs2 = new XmlSerializer(typeof(Class1),new Type [] {typeof(Class2)}); 我仍然得到相同的錯誤。 – Alexzander 2011-05-19 19:24:46
好吧,也許原因解決方法不適合你是因爲你的動態加載。作爲一個實驗,你可以使用靜態加載來嘗試它,並且1)看看你是否仍然得到錯誤,並且2)通過靜態加載來查看解決方法是否適用於你。如果問題是動態加載,那麼我建議你輸入一個新的Connect文章並在這裏發佈URL。 – 2011-05-20 00:52:39