次の特徴を持つ .NET クラス ライブラリを開発しました。
- .NET 4.0、任意の CPU
adodb.dll
.NET Primary Interop Assembly フォルダーからの参照- true に設定してビルドし
Embed Interop Type
ます (デフォルト) - COM によって使用される ADODB.RecordSet を公開します。
VSTO アドインを介してアセンブリを VBA に公開します。私のマシンでは正常に動作しますが、クライアント マシンでは、アセンブリが aのプロパティSystem.TypeLoadException
にアクセスしようとすると、 a がスローされます。Fields
RecordSet
public Recordset Test() {
Recordset result = new Recordset();
result.CursorLocation = CursorLocationEnum.adUseClient;
Fields resultFields = result.Fields; // EXCEPTION THROWN HERE.
...
}
例外メッセージ:
Could not load type 'ADODB.FieldsToInternalFieldsMarshaler' from assembly 'MyCompany.MyProduct.Interop.Com
.
失敗したクライアント: Win XP/32、Win 7/64。どちらもローカル管理者権限を持っていません。どちらも.NET 4.0
更新:この投稿は私の問題について説明しています。受け入れられた回答(遅延バインディング)はうまくいきませんでしたが、ボブの回答はうまくいきました(相互運用機能を埋め込まないでください)。
Embed Interop Types
に設定するとすぐにFalse
、すべてが魔法のように機能し始めました。
それで、私の質問は「相互運用機能の埋め込みが機能しないのはなぜですか?」に変わりました。クライアント マシンでの問題を回避するためのベスト プラクティスだと思いました。