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

2024-04-27

你如何使用这里描述的技术 https://stackoverflow.com/questions/3235916/a-way-how-to-compile-c-library-into-net-dll/3236027#3236027使用 .Net 中的 C 结构?

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

所以我想知道的是

C 结构体 A 的参数之一是结构体 B,该结构体 B 至少由 2 种类型组成,其中之一是指向应声明的某个变量 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 文件。在“项目属性”>“构建”中,选中“允许不安全代码”。

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 结构成员。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 当传递 VBA 类的实时实例时,C# ITypeInfo.GetContainingTypeLib 失败

    所以我尝试过打电话ITypeInfo在 VBA 类实例上 虽然它看起来很有希望 但我想看看是否可以获得对其包含项目 类似于类型库 的引用 我想ITypeInfo GetContainingTypeLib可能有用 但它会抛出一个异常 表明 V
  • 构建jquery复选框-无法设置选中值

    这看起来很简单 我不知道这是一个错误 还是我做错了什么 我想要做的是在 jquery 中构建一个复选框输入 然后返回输入的字符串 我有这个代码 var obj
  • 无法使 npm install -g 适用于我的包

    我正在尝试将 CLI 功能添加到我的 npm 包拦截代理中 我找不到任何好的文档 所以我基本上从express js 复制和修改了内容 I added bin intercept proxy bin intercept proxy 我的 p
  • 如何在magento中将订单状态设置为“完成”

    如何手动将订单状态设置为 完成 我正在使用以下代码 但它给出错误消息 订单状态 完成 不得手动设置 order Mage getModel sales order gt loadByIncrementId order id order gt
  • 如何在 JSF 中使用 EL 内的 HTML 字符实体?

    我想使用em dash http en wikipedia org wiki Dash在一个值属性中h link成分 这是我的尝试 目前不起作用
  • bash 脚本中带有 PKCS#12 证书的 cURL

    我必须连接到网络服务 其中必须有 pkcs12 证书 这个想法是在 bash 脚本中使用curl 具体来说 在 OS X 下 我了解到 curl 在通信中无法做的少数事情之一是处理 pkcs12 证书 p12 我有什么选择 我读过将证书转换
  • Typescript:映射联合类型时的类型级数学

    是否可以使用类型级数学来映射打字稿中的联合类型以生成作为第一个联合的函数的新联合 例如 我想使用现有的联合类型 type foo 768 1024 1280 为了产生这个并集 每个选项除以 16 type bar 48 64 80 如果工会
  • 编译资产时“堆栈级别太深”

    运行后brew upgrade 或者其他更新了我的 gems ruby 版本的东西 我的rake assets precompile任务不再有效 我收到此错误 rake aborted stack level too deep in Use
  • 梯度下降Matlab实现

    我已经浏览了堆栈溢出中的许多代码 并在同一行上编写了自己的代码 这段代码有一些问题我无法理解 我正在存储值 theta1 和 theta 2 以及用于分析目的的成本函数 x 和 Y 的数据可以从此下载页 它具有 dat 文件形式的 x 和
  • Rails 3 具有 12 小时格式的时间选择表单助手?

    Rails 3 有用户友好的 time select 吗 默认的 time select 表单助手为您提供小时 00 23 分钟 00 59 和可选的秒 00 59 对于我们这些非军事时间的人来说 0 23 小时的下拉列表非常令人沮丧 用户
  • System.Design 去哪儿了?

    我正在制作一个使用 ScintillaNet 的 C 项目 它显示 无法解析引用的程序集 ScintillaNet 因为它依赖于 System Design Version 4 0 0 0 Culture neutral PublicKey
  • 如何在reactjs中将可选元素作为 prop 传递给组件

    我试图找出正确的 反应 方式来传递一个可选的 prop 该 prop 是一个容器组件的 Element 该组件的处理方式与该组件的子组件不同 举一个简单的例子 我有一个面板组件 它渲染它的子组件 它还有一个可选的 title 道具 为了示例
  • 字母数字和空格的正则表达式

    不能包含除空格之外的任何特殊字符的文本的正则表达式是什么 Because Prajeesh https stackoverflow com users 112352 prajeesh只想匹配空格 s 不够 因为它匹配所有空白字符 包括换行符
  • 如何克隆 GitHub wiki?

    如何克隆 GitHub 存储库的 wiki 我知道它保存为单独的 Git 存储库 但我不记得路径了 我试过了 reponame wiki git and reponame git wiki 但两者都不正确 Append wiki git到存
  • 如何将带有动态内容的无序列表居中放置在 div 中?

    我正在尝试找出一种将 div 内的无序列表垂直居中的方法 我找到了很多方法来做到这一点 但是我的 ul 标签中的 li 标签中有 PHP 代码 可以从数据库获取文本 这会导致 li 标签中的文本长度发生变化 显着导致内部垂直筛选我的 div
  • SSIS Forloop:根据迭代次数为变量名称赋值

    我正在尝试使用 For 循环容器为最多 10 个不同的变量赋值 变量1 变量2 变量10 基于迭代次数 我需要循环根据一个变量迭代一定次数 该变量已根据查询的结果集分配了一个整数值 该部分工作得很好 我不知道如何告诉 for 循环使用哪个变
  • Android 中“屏幕尺寸”和“屏幕密度”之间的区别?

    我有几个问题 是什么屏幕尺寸 是什么屏幕密度 什么是不同之处之间屏幕尺寸 and 屏幕密度 Android 如何支持不同的密度和不同的屏幕尺寸 我已经读过官方文档 http developer android com training mu
  • 转换多索引时间序列的最有效方法

    我有一个由许多堆叠时间序列组成的 DataFrame 索引为 poolId Month 其中两者都是整数 月 是自 2000 年以来的月数 计算多个变量的一个月滞后版本的最佳方法是什么 现在 我做了类似的事情 cols to shift b
  • 按主题更改 ActionBar 的高度

    我想删除 ActionBar 下面的阴影 我知道我需要将高度更改为 0dp 但我想在主题中执行此操作 对于 Android 4 4 我使用
  • 您如何使用(描述的)技术来处理 .Net 中的 C 结构和指针?

    你如何使用这里描述的技术 https stackoverflow com questions 3235916 a way how to compile c library into net dll 3236027 3236027使用 Net