ADODB无法从程序集加载类型“ADODB.FieldsToInternalFieldsMarshaler”

27

我正在尝试像这样读取ADODB.Recordset对象(这是我第一次,所以请原谅我的“新手” : D):

我尝试读取一个ADODB.Recordset对象,如下(这是我的第一次,所以请原谅我的“新手”:D):

Presentation.Category categorySvc = new Presentation.Category();
ADODB.Recordset categories = categorySvc.ListAll("BE", "DUE", "EN", 128);
foreach (var category in categories.Fields) // here is where I get the exception
{
   // ...
}

ListAll调用工作正常 - 我可以得到带有一些数据的Recordset,通过对对象进行QuickWatch进行确认。但是当代码到达categories.Fields时,我遇到了以下异常:

无法从程序集'TestCOMCalls,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null'中加载类型“ADODB.FieldsToInternalFieldsMarshaler”。

我在Google上搜索了这个错误(或者只是'ADODB.FieldsToInternalFieldsMarshaler'),但找不到任何能帮助我解决问题的内容。

我想知道,我是否漏掉了一个引用?除了常规引用之外,我已将此引用添加到我的项目中:

ADODB Microsoft ActiveX Data Objects 2.5 Library C:\WINDOWS\assembly\GAC\ADODB\7.0.3300.0__b03f5f7f11d50a3a\ADODB.dll

就像我说的,我以前从未这样做过,但是通过搜索一些人做到了这一点(在对象.Fields上进行foreach),并且似乎他们的方法可以工作。

非常感谢您的任何帮助或指导 :)

谢谢!

6个回答

53

这是在个别引用中而非项目属性中设置。在 "解决方案资源管理器" 窗口中,打开 "引用"(在项目下),然后点击要修改的引用。属性窗口会有一个名为“嵌入互操作类型”的选项(针对每个引用)。

在 Visual Basic 2010 中:

要关闭嵌入互操作类型:

项目菜单 > 显示所有文件,解决方案资源管理器: > 引用: > ADODB > Embed Interof types = False。Microsoft.Office.Interop.Access > Embed Interof types = False

现在您将能够发布,并且 ADODB 将出现在:项目菜单 > 项目属性… 发布标签页 > 应用程序文件中。


这个对我也起作用了。如果我没记错的话,当我把 EmbedInteropTypes 设为 False 时,CopyLocal 会自动改为 True,这让我感到意外。 - Chad

22

解决:

解决方案资源管理器 -> 显示所有文件(菜单项) -> 引用 -> Adodb -> (属性) -> 嵌入互操作类型 -> False。


11

看看我在这个问题上发现的东西。我参考了你的,但仍然无法让ADODB工作。

补充一点:

SolutionExplorer --> 查看所有文件。 对于ADODB: - 嵌入... = False; - 复制本地 = True。


7

我遇到了清除临时文件(VS 2017)的问题。解决此异常的方法是更改:解决方案资源管理器 > 引用 > adodb > "右键单击并选择属性" > 嵌入互操作类型,将“True”设置为“False”


7

在VS 2013中遇到了相同的问题,解决方法是进入引用(References)并选择ADODB,在属性(Properties)中您将看到嵌入互操作类型(Embed Interof types)=True,然后将其更改为false。


更多细节:展开项目,展开引用,选择ADODB,右键单击,选择属性。 - Al Lelopath

1

好的,我想到了如何做到这一点:

Presentation.Category categorySvc = new Presentation.Category();
ADODB.Recordset categories = categorySvc.ListAll("BE", "DUE", "EN", 128);
categories.MoveFirst();
while(!categories.EOF)
{
    var fields = ((dynamic)categories).Fields;
    for (int i = 0; i < fields.Count; i++)
    {
        var field = fields[i];
        var name = field.Name;
        var value = field.Value;
        // ...
    }
    categories.MoveNext();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接