【问题标题】:Using vb.net dll in unmanaged c++ project在非托管 c++ 项目中使用 vb.net dll
【发布时间】:2011-01-01 19:21:51
【问题描述】:

我创建了一个名为“WSdll.dll”的 vb.net dll。 我编译了它,创建了一个类型库(tlb),并在全球范围内注册了它(gacutil).. 它包含一个名为 wsutils.vb 的文件,其中包含一个名为“wsutils”的命名空间。 在命名空间中,有一个名为“IWSconnection”的接口(带有属性)和一个名为“WSconnection”的类。 接口和类是公共的,所有方法和属性也是如此。

然后我尝试在非托管 c++ 项目中实现它。

我导入了它: #import "..\WSdll\WSdll\bin\Debug\WSdll.tlb" \ raw_interfaces_only,\ 命名_guids,\ no_namespace

然后尝试创建一个实例: CComPtr pIWSconnection; pIWSconnection.CoCreateInstance(__uuidof(wsutils::WSconnection));

我收到 2 个错误 a)wsutils 不是类或命名空间名称 b)wsconnection 未声明的标识符

我还需要执行哪些其他步骤才能让 dll 在这里工作?

TIA

【问题讨论】:

    标签: c++ vb.net com dll interop


    【解决方案1】:

    您将 no_namespace 放在 #import 行中 - 因此您的对象不在 wsutils 命名空间中,而是在全局命名空间中。从#import 行中删除 no_namespace,或从对象创建行中删除 wsutils::。

    【讨论】:

    • 谢谢一百万!那行得通。现在,我还有一个问题:我使用以下方法创建了对象: CComPtr pIWSconnection; pIWSconnection.CoCreateInstance(__uuidof(IWSconnection));然后,当我尝试调用一个方法时:pIWSconnection.connect(...) 我收到一个错误:pIWSconnection undeclared identifier 为什么它可以与“CoCreateInstance”一起使用,而不是“connect”?
    • 首先,你应该 pIWSconnection->connect。顺便问一下,为什么要将 ATL 智能指针 (CComPtr) 与 Native COM 混合使用?
    【解决方案2】:

    在您的 VB.NET 代码中使用的命名空间名称对 COM 客户端不可见。只需省略 wsutils:: 前缀。每当您对 #imported 名称的外观有疑问时,请使用您的编辑器打开自动生成的 .tlh 和 .tli 文件。

    【讨论】:

    • 默认情况下,#import 将所有接口和类放入与 typelib 名称(内部名称,而不是文件名)匹配的命名空间中。默认情况下,它与生成的 .NET 类型库的项目名称匹配。默认情况下,它是 .NET 项目中所有类的默认命名空间。 :) 无论如何,错误是关于命名空间不匹配的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-04
    • 2011-08-22
    • 1970-01-01
    • 2014-12-10
    • 2016-12-12
    相关资源
    最近更新 更多