【问题标题】:How you use technique (described) to work with C structures and pointers from .Net?您如何使用技术(已描述)来处理来自 .Net 的 C 结构和指针?
【发布时间】:2010-07-13 16:12:58
【问题描述】:

如何使用 technique described here 处理来自 .Net 的 C 结构?

当然,我需要一个代码示例 - 包含 3 个部分:C 声明部分、C++ 环绕 C 和 C# 访问。

所以我想知道的是

C 结构 A 具有作为其参数之一的结构 B,该结构 B 由至少 2 种类型组成,其中一种是指向应声明的某个变量 C 的指针。

我们希望能够从 C# .Net 访问所有 A 和 B 结构及其参数和变量 C。

这样的事情怎么办?

【问题讨论】:

    标签: c# .net c++ c clr


    【解决方案1】:

    假设这些是名为 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 文件。在 Project Properties > Build 中,勾选“Allow unsafe code”。

    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();
    }
    

    如您所见,原来的 StructA 在某种程度上被淘汰了!!由于访问问题,我不知道有任何其他方法可以直接从 C# 访问 C 结构成员。

    【讨论】:

      猜你喜欢
      • 2017-02-08
      • 1970-01-01
      • 1970-01-01
      • 2013-05-17
      • 2021-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-03
      相关资源
      最近更新 更多