2013-03-24 53 views
2

我有一個C#應用程序。它引用了一個C++ - cli dll。在C的命名空間++ DLL中的公共結構聲明:公共結構在託管c + + dll無法看到從c#

namespace Wrapper { 

    public struct maxs 
    { 
    public: 
     char Name[255]; 
     int num; 
    }; 
etc 

有一個在C++ DLL,它返回一個指針的指針結構的功能。

Wrapper::Maxs** Wrapper::Class1::CallMax(); 

C#的應用程序引用C++ DLL,並聲明結構的實例(不安全代碼)

Wrapper.Class1 oMax = new Wrapper.Class1() 
Wrapper.Maxs** maxs; 
maxs= oMax.CallMax(); 
int num = oMax.m_num; 

然後我嘗試訪問MAXS領域像這樣:

for(int i = 0; i < num; ++i) 
{ 
    name = maxs[i]->name; 
    } 

但是,該'名稱'字段在c#intellisense中不可見,並且不能編譯。 有趣的是我去看看在C++中的元數據結構的定義和結構是空白..

using System; 
using System.Runtime.CompilerServices; 

namespaceWrapper 
{ 
    [CLSCompliant(false)] 
    [NativeCppClass] 
    [UnsafeValueType] 
    public struct Maxs 
    { 
    } 
} 

是正常嗎? 所以問題是:爲什麼C#不能看到公共結構最大值的字段?爲什麼元數據信息顯示空白結構? 謝謝。

+3

因爲它不是託管結構。您需要將其聲明爲「公共價值結構」。 – 2013-03-24 02:33:32

+0

謝謝漢斯!完成了這項工作,我學到了新的東西。 – user2192008 2013-03-24 04:36:37

+0

@HansPassant:你介意給出一個答案,所以作者可以接受它..?我知道這很不重要,但是這個線程將會以其他方式掛起。這是不合資格被關閉.. – quetzalcoatl 2013-03-28 00:16:42

回答

1

這是正確的答案AFAIK:

因爲它不是一個管理結構。您需要將其聲明爲公共值結構。 - Hans Passant Mar 24 at 2:33