c# - 使用 MSDASC.DLL 时应如何修复 "At least one of the arguments for ' .. .' cannot be marshaled"错误

标签 c# marshalling com-interop

我有一个引用 COM 对象 Microsoft OLE DB Service Component 1.0 类型库 的 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

最佳答案

它们确实是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

关于c# - 使用 MSDASC.DLL 时应如何修复 "At least one of the arguments for ' .. .' cannot be marshaled"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56843244/

相关文章:

.net - 如何正确地将 VB-Script 数组编码到用 C# 编写的 COM 组件或从中编码

c# - 我想在 GridView 中编辑我的表格

c# - 如何在 .NET 测试中传入模拟的 HttpClient?

serialization - 当通过远程 EJB 从数据库加载数据时,Java Web Start 应用程序会出现 MARSHAL 异常

C# 编码回调

c# - 将托管控制托管为 CWnd 时应用程序挂起

c# - 将 BYTE 的 VARIANT 的 SAFEARRAY 编码到 C#

c# - 通过公共(public)访问器访问本地私有(private)变量是一种错误的形式吗?

c# - AjaxControlToolkit ModelPopupExtender 显示屏幕左侧而不是中心

sockets - 通过使用监听多个 UDP 套接字来避免数据包类型检查