我开发了一个具有以下特点的 .NET 类库:
- .NET 4.0,任何 CPU
adodb.dll
.NET Primary Interop Assembly 文件夹中的引用- 设置为 true的构建
Embed Interop Type
(默认) - 公开 ADODB.RecordSet 以供 COM 使用。
我通过 VSTO 插件将程序集公开给 VBA。它在我的机器上运行良好,但在客户端机器上,我的程序集System.TypeLoadException
在尝试访问 a 的Fields
属性时会抛出 a 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
,一切都开始像魔术一样工作。
所以我的问题变成了“为什么嵌入互操作不起作用?” 我认为这是避免客户端机器出现问题的最佳做法。