c# - WCF Com Interop GetRecordInfoFromGuids 返回旧格式或无效类型库

标签 c# c++ com-interop safearray

我在 C# 中定义的 WCF 服务中有一个结构

   [DataContract]
   [StructLayout(LayoutKind.Sequential), Serializable]
   [ComVisible(true)]
   public struct MyData
   {
      [DataMember]
      public int data1;

      [DataMember]
      public string data2;
   }

我正在尝试从 MFC 应用程序创建此结构的 SafeArray。像这样调用 GetRecordInfoFromGuids 时

hr = GetRecordInfoFromGuids(LIBID_MyLib, 1, 0, LOCALE_USER_DEFAULT, __uuidof(MyData), &pRI);

我得到一个返回值

0x80028019 Old format or invalid type library. 

这是怎么回事?

最佳答案

我设法解决了这个问题,当我在 Google 上搜索时发现了 3 或 4 个相同的问题,但没有一个有答案,我想我会更新我的,所以它确实有解决方案。

事实证明,字符串数据成员被默认编码为 LPSTR。我从来没有想过这可能是个问题,事实上没有文档说明这可能是个问题。当作为单个对象传递时没有问题。然而,事实证明,当传递这些对象的数组时,字符串成员必须被编码为 BSTR。否则,您会在 GetRecordInfoFromGuids 中收到类型库无效的错误。确实没有文档暗示这就是此调用返回类型库无效的原因。我只是通过反复试验才发现问题所在。

所以上面的代码只需要改成这样

   [DataContract]
   [Guid("xxx")]
   [StructLayout(LayoutKind.Sequential), Serializable]
   [ComVisible(true)]
   public struct MyData
   {
      [DataMember]
      public int data1;

      [DataMember]
      [MarshalAs(UnmanagedType.BStr)]
      public string data2;
   }

现在 GetRecordInfoFromTypeInfo 成功了,我可以成功创建和传递数据。

关于c# - WCF Com Interop GetRecordInfoFromGuids 返回旧格式或无效类型库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31387099/

相关文章:

c# - 使用 GDCM 将 16 位图像写入 DICOM 文件格式

c++ - map<int, vector<int>> graph 和 graph[i].begin() 无法解析

c# - 我应该如何声明 Microsoft.Office.Interop.Excel.Worksheet 以便我可以在 C# 中关闭它?

.net - C# 类库 "Make assembly COM-Visible"灰色或不可用

c# - TLB 到部署时没有 Regsrv32 的托管 .NET 程序集

c# - 如何在 C# 中的列表框中插入复选框?

C# linq 查询聚合可为空 boolean 值

c# - 打印异常 : The device is not ready

c++ - 将字符串函数复制到非 const char 缓冲区

c++ - 从其他类获取数组