IJW:托管代理结构? 我正在把一些C++代码移植到托管.NET中。我将需要保留一些C++代码,并尝试使用IJW方法。我知道有可能声明一个非托管结构,以便它正确地被封送到.NET代码,但是C++编译器似乎没有这样做。

IJW:托管代理结构? 我正在把一些C++代码移植到托管.NET中。我将需要保留一些C++代码,并尝试使用IJW方法。我知道有可能声明一个非托管结构,以便它正确地被封送到.NET代码,但是C++编译器似乎没有这样做。,.net,unmanaged,marshalling,.net,Unmanaged,Marshalling,例如,我有以下代码(托管): 它可以编译,但当我使用reflector查看它时,代码如下所示: public class Class1 { // Methods private static unsafe MyStruct GetMyStruct() { MyStruct x; *((int*) &x) = 1; *((int*) (&x + 4)) = 1; return x; }

例如,我有以下代码(托管):

它可以编译,但当我使用reflector查看它时,代码如下所示:

public class Class1
{
    // Methods
    private static unsafe MyStruct GetMyStruct()
    {
        MyStruct x;
        *((int*) &x) = 1;
        *((int*) (&x + 4)) = 1;
        return x;
    }
}

[StructLayout(LayoutKind.Sequential, Size=8), NativeCppClass, 
                      MiscellaneousBits(0x41), DebugInfoInPDB]
internal struct
{
}
基本上,MyStruct中没有任何字段对.NET可见。有没有办法告诉C++编译器生成它们? <>强>当回答时,请考虑这个< /强>:我知道如何创建一个可以被.NETFramework可见的托管类。我对此不感兴趣。我想要的是C++编译器以.NET理解它的方式声明非托管结构,比如:

[StructLayout(LayoutKind::Sequential, blablabla ... )]
struct MyStruct
{
    [MarshalAs ....... ]
    System::Int32 some_int;
    [MarshalAs ....... ]
    System::Int32 some_long;
};

如果您想定义一个公共结构,可以从.C++托管代码中定义.Net应用程序,这里有一个方法来做(注意‘公共’和‘值’关键字”:

如果希望非托管结构在C#和C/C++之间移动,则必须在两侧声明它。如C中所示:

struct MyUnmanagedStruct
{
         int some_int;
         long some_long;
};
比如说,在C#中:

[StructLayout(LayoutKind.Sequential)]
struct MyUnmanagedStruct
{
    public int some_int;
    public long some_long; // or as int (depends on 32/64 bitness)
};

您必须确保.NET中的字段与C中的字段匹配。您可能需要使用属性(尤其是Pack)。请看这里的两个教程:和这里:

在过去的两年中,这个问题被浏览了194次,不乏关注。没有答案就足以证明这是不可能的。一个非托管结构必须被封送,结构的.NET布局规则与C或C++编译器基本上不兼容。提供了一些关于.NET为何以这种方式工作的背景信息。

但我可以使用完全相同的布局在c#中定义一个结构并强制转换指针。对于同一个结构,必须做出两个相同的定义,这似乎是一种耻辱。谢谢链接!这就是链接的要点,事实上,你不能用完全相同的布局在C#中定义一个结构。只能指定封送处理后有效的布局。实际的布局是完全不可发现的。是的,但这会使结构受到管理。这个问题是关于访问C#@Derrick-Hmmm中本机结构的成员的。。。我不太清楚,反正我已经更新了答案。谢谢。我现在就是这样做的。在两侧使用1的包可以产生相同的内存布局,这允许我接收指向C++/CLI非托管结构的指针,并将其强制转换为C#结构。这里的耻辱,我认为作者试图解决的问题是代码重复,导致可维护性问题。您还可以将C++中的Struts两次声明为托管和非托管版本,并且在C中执行至少让您远离不安全块的转换。我想某种形式的代码生成可能是唯一的解决方案。@Derrick-如果重复是您的问题,有一些方法可以自动进行互操作,请参见此处,以便:
struct MyUnmanagedStruct
{
         int some_int;
         long some_long;
};
[StructLayout(LayoutKind.Sequential)]
struct MyUnmanagedStruct
{
    public int some_int;
    public long some_long; // or as int (depends on 32/64 bitness)
};