Google Contact嵌入式DLL上的MissingMethodException

时间:2014-12-13 15:46:25

标签: c# reflection embedded-resource google-contacts missingmethodexception

我想在库中创建一个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;

为什么代码会返回此错误?

2 个答案:

答案 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的字典,因此当域请求解析程序集时,代码将返回相同的程序集