将 C# 数据类型参数传递给用 C++ 编写的 dll?

2024-05-21

仍在解决从这里开始的问题从 C# 调用 C++ dll 函数:结构体、字符串和 wchar_t 数组。 https://stackoverflow.com/questions/680066/calling-c-dll-function-from-c-of-structs-strings-and-wchart-arrays,但采用不同的方法。

遵循示例从非托管代码调用托管代码,反之亦然 http://www.codeproject.com/KB/mcpp/unmanaged_to_managed.aspx我用 C++ 编写了一个托管包装器来访问非托管 C++ dll 中的 unmanages 类。

它看起来像这样:

//in header file
public __gc class TSSLDllWrapper
{
public:
TSSLDllWrapper();
     //this is the unmanaged class
CcnOCRsdk * _sdk;

bool convertHKID_Name(char *code, RECO_DATA *o_data);
};

//in .cpp file
TSSLDllWrapper::TSSLDllWrapper(void)
{
  _sdk = new CcnOCRsdk();
}

bool TSSLDllWrapper::convertHKID_Name(char *code, RECO_DATA *o_data)
{
return _sdk->convertHKID_Name(code, o_data);
}

//C++ RECO_DATA structure definition:
struct RECO_DATA{
wchar_t FirstName[200];
wchar_t Surname[200];
};

现在我有了一个可以导入到我的 C# 项目中的 dll。

然而问题是: 当我想从dll文件中调用方法时,如下所示:

TSSLDllWrapper wrapper = new TSSLDllWrapper();
bool res = wrapper.convertHKID_NameSimple( //need to pass parameters here );

它需要 C++ 参数 - 指向 char 和 RECO_DATA 的指针。

如何解决此问题并从 C# 代码传递 C++ 类型?


转换大多数 C 数据类型的一种方法是使用PInvoke 互操作助手 http://www.codeplex.com/clrinterop/Release/ProjectReleases.aspx?ReleaseId=14120。它将为大多数 C 结构创建正确的 C# / VB.Net 类型。这是 RECO_DATA 的输出

[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential, CharSet=System.Runtime.InteropServices.CharSet.Unicode)]
public struct RECO_DATA {

    /// wchar_t[200]
    [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst=200)]
    public string FirstName;

    /// wchar_t[200]
    [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst=200)]
    public string Surname;
}

对于 char* 参数,您可以传递 IntPtr.Zero 或使用 Marshal.StringToCoTaskMemAnsi 来完成工作。

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

将 C# 数据类型参数传递给用 C++ 编写的 dll? 的相关文章

随机推荐

  • Java单例内部类

    我知道Java中单例的概念 我在 Java 中创建单例作为内部类时遇到问题 问题发生在持有者身上 public class NormalClass private class Singleton private static Singlet
  • Python:Urllib2 和 OpenCV

    我有一个程序 可以将图像保存在本地目录中 然后从该目录中读取图像 但我不想保存图像 我想直接从url读取它 这是我的代码 import cv2 cv as cv import urllib2 url http cache2 allposte
  • 线程输出到 GUI 文本字段

    我试图在 GUI 的 TextField 中输出 但我得到的只是线程信息 这只是完整代码的一小部分 但完整版本也有同样的问题 完整版本有 5 个不同的线程同时运行 任何帮助或建议将不胜感激 public class O21 implemen
  • WordPress 插件滑块革命错误

    我无法摆脱以下错误 我激活插件后出现错误 Slider Revolution error could not unzip into the revslider public assets folder please make sure th
  • 使用 PyCharm 用海龟(python)绘图

    我正在运行最新的 PyCharm Pro 版本并尝试从临时文件运行以下代码 但它似乎不起作用 import turtle wn turtle Screen alex turtle Turtle alex forward 150 alex l
  • 无法删除 Microsoft Access 2003 中的主 -> 子子表单链接

    我在删除访问子报表数据表单中的主 gt 子链接字段时遇到问题 我尝试了各种方法来删除它们 使用子报表的属性窗口以及链接向导 我还从数据库中删除了子报表 然后将现有对象重新导入到新的访问实例中 一旦我重新添加子表单并将其命名为相同的名称 链接
  • 删除 Git 存储库,但保留所有文件

    在我使用 Linux 的过程中的某个时刻 我决定将我的主目录中的所有内容都放入源代码管理中是个好主意 我不是在问这是否是一个好主意 我是在问如何撤销它 删除存储库的原因是我最近安装了 Oh My Zsh 而且我非常喜欢它 问题是我的主目录有
  • 将对象列表添加到 ef 中的上下文

    是否可以在不使用 foreach addObject 的情况下将对象列表添加到实体框架中的 Context 感谢帮助 从 EntityFramework 6 开始 您可以使用DbSet AddRange 方法 IEnumerable htt
  • pandas DataFrame 连接/更新(“upsert”)?

    我正在寻找一种优雅的方法将一个 DataFrame 中的所有行附加到另一个 DataFrame 两个 DataFrame 具有相同的索引和列结构 但如果两个 DataFrame 中出现相同的索引值 请使用第二个数据中的行框架 因此 举例来说
  • JUnit5断言全部

    代码如下所示 我希望它去测试 keyNames 的所有元素 但是 如果任何测试失败 它就会停止 并且不会迭代所有数组元素 我的理解是 在assertAll中 所有断言都会被执行 并且任何失败都应该一起报告 感谢您的时间和帮助 private
  • 将 firestore 中的数据分配给变量

    我尝试使用 get doc 函数将 firestore 数据库中的变量分配给它们所尊重的值 我注意到它不会分配或更新这些值 我尝试使用异步和等待 但似乎无法使其工作 getFromDatabase nameOfCollection name
  • 如何抑制Windows防火墙的Windows安全警报?

    当我从这里找到的 ZeroMQ 指南中用 C 创建 Hello World 示例时 http zguide zeromq org page all Ask and Ye Shall Receive http zguide zeromq or
  • 可搜索修饰符不在导航栏标题下方显示搜索栏

    我正在使用 iOS 15 并尝试新版本searchableSwiftUI 中列表的修饰符 看起来就像你附加时searchable text searchText 对于 NavigationView 搜索栏默认呈现在屏幕上导航栏标题下方 当我
  • 在 C/C++ 中解码和匹配 Chip 8 操作码

    我正在编写一个 Chip 8 仿真器作为仿真的介绍 但我有点迷失了 基本上 我读取了 Chip 8 ROM 并将其存储在内存中的字符数组中 然后 按照指南 我使用以下代码来检索当前程序计数器 pc 处的操作码 Fetch opcode op
  • 按字母顺序查找最长的子串

    我有在另一个主题上找到的这段代码 但它按连续字符而不是按字母顺序对子字符串进行排序 如何纠正它的字母顺序 它打印出来lk 我想打印ccl Thanks ps 我是python初学者 s cyqfjhcclkbxpbojgkar from i
  • 在 Drupal 中选择性地删除页面的样式表

    我正在尝试为首页制作不同的布局 在此过程中 我声明了名为 front page css 和 page front tpl php 的新样式表 我正在使用加载responsive sidebar css 的 Zen 子主题 我想删除 resp
  • 联合体的大小比预期大。这里如何进行类型对齐?

    include
  • 构造微积分中的“Refl”东西?

    在语言中 例如Agda Idris or Haskell对于类型扩展 有一个 键入类似于以下内容的内容 data a b where Refl a a a b意思是a and b是相同的 这样的类型可以定义在结构演算 https en wi
  • 在 C# 中在 Windows 标题栏区域中创建选项卡

    有人可以告诉我如何在 C Winforms 应用程序的标题栏区域中创建选项卡吗 我正在寻找类似于 Google Chrome 的外观 Chrome 中的每个选项卡都停靠在主应用程序窗口的标题栏中 尝试将表单的 FormBorderStyle
  • 将 C# 数据类型参数传递给用 C++ 编写的 dll?

    仍在解决从这里开始的问题从 C 调用 C dll 函数 结构体 字符串和 wchar t 数组 https stackoverflow com questions 680066 calling c dll function from c o