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();
}
}
答案 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试图简化那些有点复杂的机器。
当您使用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;。这应该可以正常工作。