【问题标题】:Visual C++ compile error C2871 - <namespace> : a namespace with this name does not existVisual C++ 编译错误 C2871 - <namespace>:具有此名称的命名空间不存在
【发布时间】:2011-07-06 04:03:33
【问题描述】:

我正在尝试创建一个 ManagedWrapper dll,该 dll 可以从不会使用 /clr 开关编译的 MFC 应用程序调用。在我的测试 MFC 的标题中,我声明了以下内容:

#import "ManagedProxy.tlb"
using namespace ManagedProxy;

当我尝试编译测试 MFC 应用程序时,我收到错误 C2871:'ManagedProxy':具有此名称的命名空间不存在。我确信这在昨天还有效。如果我指定了错误的 tlb 文件名,我会收到编译错误 C1083,这表明 tlb 文件正在正确加载。

为什么现在 Visual Studio 会抱怨,为什么它以前可以工作?

加法:

我刚刚发现我的代理在将命名空间更改为 ManagedProxy 后停止工作。我已经重新编译了托管项目,并且本机应用程序具有作为附加包含路径的托管项目的调试文件夹,因此它应该引用最新的 tlb,但事实并非如此。我尝试了 tlb 的绝对路径,清理并重建了项目,但没有成功。

为什么 tlb 没有改变命名空间?

加法 使用对象浏览器查看 TLB 中的内容,并且命名空间 ManagedProxy 以某种方式重命名为其他内容。我还缺少几个接口,尽管它们标有 ComVisible(true)。

有人请帮忙....

TIA。

【问题讨论】:

    标签: com interop


    【解决方案1】:

    您可以在导入时重命名命名空间。

    #import "ManagedProxy.tlb" rename_namespace("ManagedProxy")
    

    【讨论】:

    • 感谢您的提示。拯救了我的一天。我还刚刚发现 regasm 完全忽略了包含类和接口的命名空间,而是在为 COM 注册程序集时使用程序集名称作为命名空间。此外,如果程序集名称使用点表示法,例如 CompanyName.AssemblyName.Purpose,则会收到无法注册程序集的错误。 Visual Studio 需要以管理员身份运行。仅供参考。
    • 有人知道为什么我的一些标有 ComVisible(true) 的界面在浏览注册为 COM 的托管对象时没有显示吗?
    • 不错的提示!当我导入具有分层命名空间的托管 C# 程序集时,这也有帮助。 C++ 编译器不喜欢使用命名空间“Major.Minor”,但重命名为 MajorMinor 有效!
    【解决方案2】:

    未显示的界面可能未标记为公开。

    【讨论】:

    • 它们都被标记为公开。它们不会出现在对象浏览器中,但幸运的是可以从 C++ 中使用。
    猜你喜欢
    • 2014-10-19
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 2016-11-29
    • 2019-11-22
    • 2016-12-21
    • 1970-01-01
    • 2015-03-17
    相关资源
    最近更新 更多