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 для загрузки, чтобы при запросе домена для разрешения сборки код возвращал когда-либо одну и ту же сборку.

Другие вопросы по тегам