MissingMethodException в Google Contact встроенной DLL
Я хочу сделать aC# Library (область видимости библиотеки - это связь с API контакта Google) с зависимостью, встроенной в библиотеку.
Итак, в моем конструкторе класса я поместил этот код:
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) он вызывает " MissingMethodException ".
Почему код возвращает эту ошибку?
2 ответа
Проверьте ваш google.data.contacts.dll: вероятно, это зависит от другой DLL, которую вы не включаете (например, log4net).
Проверьте также свое внутреннее исключение, оно должно включать в себя подробности об этом.
Я нашел проблему!!! В отличие от этого, событие 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 для загрузки, чтобы при запросе домена для разрешения сборки код возвращал когда-либо одну и ту же сборку.