2012-09-12 69 views
0

什么是最好的(简单无需增加大量的开销),每股非托管scructures托管库之间?什么是分享裁判班这回非托管结构的正确方法?

可以说我有一个托管类库如下:

// MyClassLib.h 
#pragma once 
#include "MyLegacyStruct.h" 
using namespace System; 

namespace MyClassLib { 

    public ref class Class1 
    { 
    protected: 
     MyLegacyStruct* m_internalBuffer; 

    public: 
     Class1() { } 
     ~Class1() { } 

     MyLegacyStruct* GetBuffer() 
     { 
      return m_internalBuffer; 
     } 
    }; 
} 

...结构定义(库):

// MyLegacyStruct.h 
#pragma once 

namespace MyClassLib { 

    typedef struct MyLegacyStruct 
    { 
     unsigned int m_someVar; 

    } MyLegacyStruct; 

} 

...和一个简单的控制台应用程序,它要使用该库:

// ConsoleApp.cpp : main project file. 

#include "stdafx.h" 
#include "MyLegacyStruct.h" 

using namespace System; 
using namespace MyClassLib; 

int main(array<System::String ^> ^args) 
{ 
    Console::WriteLine(L"Hello World"); 

    Class1^ c1 = gcnew Class1(); 
    MyLegacyStruct* s1 = c1->GetBuffer(); // <-- This is a problem 

    return 0; 
} 

...这使得编译器抱怨:

2>.\ConsoleApp.cpp(14) : error C3767: 'MyClassLib::Class1::GetBuffer': candidate function(s) not accessible 

内部缓冲器在一些相当重负荷处理算法然后将其与.NET代码胶合一起使用,以使这一切好和模块化,挂钩到一个C#GUI以及一些命令行再加工工具。

什么是正确的方法来做到这一点?退货void *?制作一个.net ref结构体,使用它复制模块之间的所有数据然后再转换回来?

回答

2

这已经先前由Ben Schwehn回答了堆栈溢出的C++ CLI error C3767: candidate function(s) not accessible

总结:

原生类型现在由大会原生类型之外默认的私有不会默认组件之外可见。有关程序集外类型可见性的更多信息,请参阅类型可见性。这种变化是由开发者的需要使用其他,不区分大小写的语言中,当引用元数据在Visual C++编写的主要驱动。 Source

如果使用#pragma make_public(MyClassLib::MyLegacyStruct),出口在装配时MyLegacyStruct机类型,那么你的项目将编译。

+0

排序 - 好一个! –

+0

你必须给适当的归属,当你复制一个这样的答案。除了答案的链接之外,你还必须发布一个链接,指向给出答案的人的个人资料。 –

+0

嗨汉斯,我已经添加了一个链接到家伙个人资料,并添加了引用msdn的报价......这是否看起来正确? – Alex

相关问题