2012-09-12 91 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

相關問題