Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 您如何使用(描述的)技术处理.Net中的C结构和指针?_C#_.net_C++_C_Clr - Fatal编程技术网

C# 您如何使用(描述的)技术处理.Net中的C结构和指针?

C# 您如何使用(描述的)技术处理.Net中的C结构和指针?,c#,.net,c++,c,clr,C#,.net,C++,C,Clr,如何使用.Net中的C结构 当然,我需要一个代码示例——3个部分:C声明部分,C++围绕C和C的处理。 所以我想知道的是 C结构A有一个参数结构B,它至少由两种类型组成,其中一种是指向应声明的变量C的指针 我们不想从C#Net访问所有的A和B结构及其参数和变量C 如何做这样的事情?假设这些是名为structs.h的文件中的C结构 struct StructB { int bMember1; int bMember2; int* bMember3; }; struct S

如何使用.Net中的C结构

当然,我需要一个代码示例——3个部分:C声明部分,C++围绕C和C的处理。 所以我想知道的是

C结构A有一个参数结构B,它至少由两种类型组成,其中一种是指向应声明的变量C的指针

我们不想从C#Net访问所有的A和B结构及其参数和变量C


如何做这样的事情?

假设这些是名为structs.h的文件中的C结构

struct StructB
{
    int bMember1;
    int bMember2;
    int* bMember3;
};

struct StructA
{
    struct StructB aMember1;
};

在一个新的VC++DLL项目中,启用公共语言运行时支持(旧语法),并确保C++异常被禁用。为发布目标构建此版本

extern "C"
{
    #include "structs.h"
}

namespace Wrapper
{
    public __gc class NewStructB
    {
        private:
            StructB b;

        public:
            NewStructB()
            {
            }

            ~NewStructB()
            {
            }

            int getBMember1()
            {
                return b.bMember1;
            }

            void setBMember1(int value)
            {
                b.bMember1 = value;
            }

            int getBMember2()
            {
                return b.bMember2;
            }

            void setBMember2(int value)
            {
                b.bMember2 = value;
            }

            int* getBMember3()
            {
                return b.bMember3;
            }

            void setBMember3(int* value)
            {
                b.bMember3 = value;
            }
    };

    public __gc class NewStructA
    {
        public:
            NewStructB* b;

            NewStructA()
            {
                b = new NewStructB();
            }

            ~NewStructA()
            {
                delete b;
            }

            void ShowInfo()
            {
                System::Console::WriteLine(b->getBMember1().ToString());
                System::Console::WriteLine(b->getBMember2().ToString());
                System::Console::WriteLine((*b->getBMember3()).ToString());
            }
    };
};
然后创建一个新的C#控制台应用程序并引用我们刚刚构建的.dll文件。在项目属性>生成中,选中“允许不安全代码”

正如您所看到的,原始结构在某种程度上被删除了!!由于访问问题,我不知道有任何其他方法可以直接从C#访问C结构成员

static void Main(string[] args)
{
    int toBePointed = 12345;

    Wrapper.NewStructA a = new Wrapper.NewStructA();

    a.b.setBMember1(10);
    a.b.setBMember2(20);

    unsafe
    {
        a.b.setBMember3(&toBePointed);
    }

    a.ShowInfo();

    Console.ReadKey();
}