2014-09-30 17 views
0

我试图从另一个叫从C++/CLI装配一个成员函数,但是当我开始使用DirectX的结构,我得到C3767错误:候选函数不accessib用C++ CLI之间的DirectX成员组件C3767

从Utilities.dll

#pragma once 

#include "define.h" 

namespace Utilities 
{ 
    public ref class Data 
    { 
    public: 
     BOOL CreateBuffer(LPDIRECT3DDEVICE9 dev) 
     { 
      ... 
      return TRUE; 
     } 
    { 
} 

,并用它从一个渲染

#include "Renderer.h" 

namespace SomeNamespace 
{ 
    SceneRenderer::SceneRenderer(void) 
    { 

    } 

    void SceneRenderer::Render(LPDIRECT3DDEVICE9 dev) 
    { 
     ... 

     m_vbo->CreateBuffer(dev); //error C3767: 'Utilities::Data::CreateBuffer': candidate function(s) not accessible 

     ... 
    } 
} 

我知道,使用该设备INT *(& DEV)我的地址可以投回LPDIRECT3DDEVICE9,但即时通讯寻找更好的解决方案

回答

0

托管的C++程序集默认情况下不会在其公共接口中导出非托管类型。 LPDIRECT3DDEVICE9是一个非托管类型,所以你的CreateBuffer方法将被标记为私有的,而不管提供的访问说明符是什么(这种类型的愚蠢,甚至不会对此产生警告)。

使用#pragma make_public或更好的是,不要在托管界面中使用非托管类型。

建议:如果您想在托管代码中使用DirectX,请使用slimDx或Xna。这些库已经提供了一切的托管包装。

+0

[SlimDX](http://www.slimdx.org/)或[SharpDX](http://sharpdx.org/)是今天的最佳选择。有关更多背景信息,请参见[DirectX和.NET](http://blogs.msdn.com/b/chuckw/archive/2010/12/09/directx-and-net.aspx)。 – 2014-10-03 15:39:14