使用MSDASC.DLL时应如何解决“无法对'...'的至少一个参数进行编组”错误

时间:2019-07-01 22:36:09

标签: c# marshalling com-interop

我有一个引用COM对象Microsoft OLE DB Service Component 1.0 Type Library的C#桌面应用程序。这是允许用户构建和测试连接字符串的对话框。该代码已经按预期工作了几年。

MSDASC Data Link Properties editor

我发现执行“重建”时会出现18个未枚举的警告。我相信这意味着在导入类型库时会创建警告。

它们都是以下形式:

Processing COM reference "MSDASC" from path "C:\Program Files (x86)\Common Files\System\Ole DB\oledb32.dll". The type library importer could not convert the signature for the member 'tagDBPROPIDSET.rgPropertyIDs'.
Processing COM reference "MSDASC" from path "C:\Program Files (x86)\Common Files\System\Ole DB\oledb32.dll". At least one of the arguments for 'DataLinks.RemoteCreateDBInstanceEx' cannot be marshaled by the runtime marshaler.  Such arguments will therefore be passed as a pointer and may require unsafe code to manipulate.

对此进行分解,我发现仅将引用添加到一个空的WinForms项目中将生成警告。不需要访问MSDASC库的代码。

作为一种解决方法,我从重建期间生成的OBJ树中复制了Interop.MSDASC.dll,并将其复制到了项目文件夹中。我删除了对MSDASC的引用,并将其添加到了项目中的Interop.MSDASC.dll

现在,当我进行重建时,我看不到警告。我从OBJ树中删除了Interop.MSDASC.dll,并且确实重新创建了它。

这是否掩盖了我的问题?有没有更好的方法来使用对话框并隐藏或回答警告?

更新: 在VS 2017和2019中会发生这种情况,但我相信在以前的版本中也会发生。

添加了“错误列表”窗口的图像:

enter image description here

1 个答案:

答案 0 :(得分:1)

它们确实是tlbimp警告。您可以检查是否运行

TlbImp.exe "C:\Program Files (x86)\Common Files\System\Ole DB\oledb32.dll"

从VS开发人员命令提示符(或从C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.7.2 Tools之类的路径开始,适应您的计算机)。

您应该看到完全相同的警告。

如果您不使用警告中列出的成员,那将非常安全。

否则,如果您编辑.csproj并将ResolveComReferenceSilent键添加到第一个PropertyGroup元素,则可以删除所有COM参考警告,如下所示:

<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  ...
  <PropertyGroup>
    ...
    <ResolveComReferenceSilent>True</ResolveComReferenceSilent>
    ...
  </PropertyGroup>

最后一种解决方案是手动使用tlbimp.exe并引用其输出。这里有一个示例:Suppress tlbimp warnings in visual studio