我想在库中创建一个c#库(库范围是与Google联系人API的通信),依赖嵌入。
所以,在我的类构造函数中我输入了这段代码:
AppDomain.CurrentDomain.AssemblyResolve += (sender, evento) =>
{
var assemblyName = evento.Name.Split(',')[0].Trim();
if (assemblyName.ToLower().Equals("google.gdata.contacts"))
return Assembly.Load(Assembly.GetExecutingAssembly().GetEmbeddedResource("Contacts.Assembly.Google.GData.Contacts.dll"));
else if (assemblyName.ToLower().Equals("google.gdata.client"))
return Assembly.Load(Assembly.GetExecutingAssembly().GetEmbeddedResource("Contacts.Assembly.Google.GData.Client.dll"));
else if (assemblyName.ToLower().Equals("google.gdata.extensions"))
return Assembly.Load(Assembly.GetExecutingAssembly().GetEmbeddedResource("Contacts.Assembly.Google.GData.Extensions.dll"));
else if (assemblyName.ToLower().Equals("newtonsoft.json"))
return Assembly.Load(Assembly.GetExecutingAssembly().GetEmbeddedResource("Contacts.Assembly.Newtonsoft.Json.dll"));
return null;
};
这样,当 AppDomain 尝试解析Google联系人库或其依赖关系时,我会返回我的嵌入式程序集。 这个工作!!!
我的问题是当我调用此代码时:
RequestSettings settings = new RequestSettings("ApplicationName");
ContactsRequest cr = new ContactsRequest(settings);
Feed<Google.Contacts.Contact> f = cr.GetContacts();
此代码与RequestSettings相同(此类在google.data.client.dll中),但是当尝试创建ContactRequest实例(此类在google.data.contacts.dll中)时,它会引发&#34; MissingMethodException &#34;
为什么代码会返回此错误?
答案 0 :(得分:0)
检查 google.data.contacts.dll :可能取决于您不包括的其他dll(例如log4net)。
同时检查您的内部异常,它应该包含详细信息。
答案 1 :(得分:0)
我发现问题!!!与此不同,每次调用者使用未引用的程序集时,都会引发AssemblyResolve事件。但是,在我的代码中,我每次都加载相同的程序集,但对于AppDomain,它们是不同的程序集。例如:
MyDLL引发AssemblyResolve加载: google.gdata.client 和 google.gdata.contact 然后是应用程序实例ContactRequest(google.gdata.contact)。但是这个dll会使AssemblyResolve加载: google.gdata.client
对于AppDomain,google.gdata.client(在MyDLL中加载)与google.gdata.client不同(已加载google.gdata.contact)。
要解决问题,请构建一个包含所有要加载的dll的字典,因此当域请求解析程序集时,代码将返回相同的程序集