Windows运行时组件命名空间和内部成员可见性

时间:2014-11-05 07:08:05

标签: namespaces internal c++-cx

抱歉,我是C ++ CX的新手,我正在开始一个新项目并提出一些问题......

1)如何在命名空间 A.B.C 中创建WRT组件?当我使用点时,我的项目在命名空间 A_B_C ,当我在代码中更改名称空间时,我得到错误APPX1706:.winmd文件' A_B_C.winmd'包含' A.B.C.class'在其根名称空间之外' A_B_C'。我该怎么办?

2)我想在Component内部使用DirectX。我需要在DLL内的公共类之间内部共享一些内部成员(如Matrix3x2F,Device ...等),但是当我使用 internal:关键字时,我收到消息 106 IntelliSense:公共数据成员不允许使用非值类型。这个问题有什么解决方案吗?

感谢帮助...

示例:

public ref class CLS1 sealed
{
public:
    CLS1();

internal:
    // get error here
    D2D1::Matrix3x2F matrix;
};

public ref class CLS2 sealed
{
public:
    CLS2();

    void Render( CLS1^ cls1)
    {
        // need to access internal member here !
        // error
        cls1->matrix->Invert();
    }

}

3 个答案:

答案 0 :(得分:3)

现在我有解决1号问题的方法......不知道它是否理想......

1)在Visual Studio中,我创建了一个新项目 - > Windows运行时组件 - >项目名称= “A.B.C.CompName” 2)Visual Studio在命名空间“A_B_C_CompName”中创建类 3)我将名称空间更改为

namespace A{
namespace B{
namespace C{

... component code here

}}} 

4)在“A.B.C.Name.Windows.vcxproj”中我手动更改xml

<PropertyGroup Label="Globals">
    <ProjectGuid>{fcd4484d-b812-4b16-919b-b23292bdf3c5}</ProjectGuid>
    <RootNamespace>A_B_C_Name</RootNamespace>...

<PropertyGroup Label="Globals">
        <ProjectGuid>{fcd4484d-b812-4b16-919b-b23292bdf3c5}</ProjectGuid>
        <RootNamespace>A.B.C</RootNamespace>...

现在我在命名空间A.B.C中有了一个新组件;如果有人有更好的方法,请告诉我。

答案 1 :(得分:1)

WinRTComponent DLL试图简化那些有点复杂的机器。

  • VS在构建解决方案时注册WinRT组件。通过注册,我的意思是它将有关此组件的信息添加到应用程序的AppX清单中。
  • 为了激活项目中的运行时类,与WinRT组件对应的winmd文件的名称需要与运行时类的顶级命名空间匹配。

当您使用WinRTComponent DLL模板的默认设置时,VS可确保满足上述所有要求。它生成的源/头与项目名称具有相同的命名空间名称,这也恰好是输出winmd文件的名称。

但是,当您重命名组件时,输出winmd具有不同的名称,但代码中的命名空间仍然是旧的。他们需要匹配。并且,是的,只要它们位于同一名称空间中,您就可以在项目中拥有多个运行时类。

顺便说一句,我发现您的代码存在一个小问题。它应该是:

cls1->matrix.Invert();

答案 2 :(得分:0)

1)Dot是文件名嵌套分隔符。因此该文件应命名为A.B.C.winmd / dll,并且最根本公共类型的命名空间应位于命名空间A :: B :: C中。如果文件名为A_B_C.winmd,则表示名为A_B_C的单个名称空间。

2)尝试创建一个访问器方法并保持成员变量私有。您可以使访问者返回D2D1 :: Matrix3x2F&amp;。这应该可以正常工作。