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 に答える