1

我想制作 ac# 库(库范围是与 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 中)时,它会引发“ MissingMethodException ”。

为什么代码返回此错误?

4

2 回答 2

0

我发现问题了!!!与此不同的是,每次调用者使用未引用的程序集时都会引发 AssemblyResolve 事件。但是,在我的代码中,我每次都加载相同的程序集,但对于 AppDomain,它们是不同的程序集。例如:

MyDLL 引发 AssemblyResolve 加载:google.gdata.clientgoogle.gdata.contact 然后是应用程序实例 ContactRequest (google.gdata.contact)。但是这个 dll 引发 AssemblyResolve 加载:google.gdata.client

对于 AppDomain,google.gdata.client(在 MyDLL 中加载)不同于google.gdata.client(为 google.gdata.contact 加载)。

要解决问题,请构建一个包含所有要加载的 dll 的字典,因此当域请求解析程序集时,代码会返回相同的程序集

于 2014-12-14T23:57:11.123 回答
0

检查您的google.data.contacts.dll:可能它取决于您不包括的另一个 dll(例如 log4net)。

还要检查你的内部异常,它应该包括它的详细信息。

于 2014-12-14T10:59:10.850 回答