从 C# 调用包含函数指针的 DLL 函数

2024-01-08

我有一个用 C++ 编写的 DLL,其中包含导出函数,该函数具有用作回调函数的函数指针。

// C++ 
DllExport unsigned int DllFunctionPointer( unsigned int i, unsigned int (*TimesThree)( unsigned int number ) ) {
    return TimesThree( i )  ; 
}

我有一个 CSharp 应用程序,我想用它来调用 DLL 函数。

// C#
public unsafe delegate System.UInt32 CallBack( System.UInt32 number ); 
class Program
{
    [DllImport("SimpleDLL.dll")]
    public static extern System.UInt32 DllFunctionPointer( System.UInt32 i, CallBack cb) ;

    static unsafe void Main(string[] args)
    {
        System.UInt32 j = 3;
        System.UInt32 jRet = DllFunctionPointer(j, CallBack );
        System.Console.WriteLine("j={0}, jRet={1}", j, jRet); 
    }

    static System.UInt32 CallBack( System.UInt32 number ) {
        return number * 3 ; 
    }
}

上述代码的问题是应用程序崩溃并显示以下错误消息。

'CallingACallbackFromADLL.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:\XXXX\CallingACallbackFromADLL.exe', Symbols loaded.
Managed Debugging Assistant 'PInvokeStackImbalance' has detected a problem in 'C:\XXXX\CallingACallbackFromADLL.vshost.exe'.
Additional Information: A call to PInvoke function 'CallingACallbackFromADLL!CallingACallbackFromADLL.Program::DllFunction' has unbalanced the stack. This is likely because the managed PInvoke signature does not match the unmanaged target signature. Check that the calling convention and parameters of the PInvoke signature match the target unmanaged signature.

The program '[9136] CallingACallbackFromADLL.vshost.exe: Managed (v4.0.30319)' has exited with code 1073741855 (0x4000001f).

我不知道下一步该做什么。

我的问题是:

  • 从 C# 应用程序调用包含回调指针的 C++ DLL 函数的正确方法是什么。

这是因为默认情况下函数的调用约定C# is __stdcall but in C/C++默认是__cdecl,因此您应该更改函数的调用约定,如下所示:

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void TimesTree( uint frame );
[DllImport("SimpleDLL.dll")]
public static extern System.UInt32 DllFunctionPointer( uint i,
    [MarshalAs(UnmanagedType.FunctionPtr)] TimesTree callback ) ;

static unsafe void Main(string[] args)
{
    // ...
    System.UInt32 jRet = DllFunctionPointer(j, CallBack );
    // ...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 C# 调用包含函数指针的 DLL 函数 的相关文章

  • 向进度条添加百分比文本 C#

    我有一个方法可以显示进程栏何时正在执行以及何时成功完成 我工作得很好 但我想添加一个百分比 如果完成 则显示 100 如果卡在某个地方 则显示更少 我在网上做了一些研究 但我无法适应我正在寻找的解决方案 这是我的代码 private voi
  • 未提供参数时如何指定 C# System.Commandline 行为?

    在我的控制台应用程序中 当未提供控制台参数时 将执行我指定列表 在本例中为参数 3 的任何处理程序 调用该处理程序时 布尔参数设置为 false 但对我来说 根本不调用它更有意义 如何防止这种情况发生并显示帮助文本 using System
  • 如何让 Swagger 插件在自托管服务堆栈中工作

    我已经用 github 上提供的示例重新提出了这个问题 并为任何想要自己运行代码的人提供了一个下拉框下载链接 Swagger 无法在自托管 ServiceStack 服务上工作 https stackoverflow com questio
  • 复制 std::function 的成本有多高?

    While std function是可移动的 但在某些情况下不可能或不方便 复制它会受到重大处罚吗 它是否可能取决于捕获变量的大小 如果它是使用 lambda 表达式创建的 它依赖于实现吗 std function通常被实现为值语义 小缓
  • 使用 Newtonsoft 和 C# 反序列化嵌套 JSON

    我正在尝试解析来自 Rest API 的 Json 响应 我可以获得很好的响应并创建了一些类模型 我正在使用 Newtonsoft 的 Json Net 我的响应中不断收到空值 并且不确定我的模型设置是否正确或缺少某些内容 例如 我想要获取
  • 单个对象的 Monogame XNA 变换矩阵?

    我读过一些解释 XNA Monogame 变换矩阵的教程 问题是这些矩阵应用于 SpriteBatch Begin matrix 这意味着所有 Draw 代码都将被转换 如何将变换矩阵应用于单个可绘制对象 就我而言 我想转换滚动背景 使其自
  • 回发后刷新时提示确认表单重新提交。我做错了什么?

    我有一个以空白 默认状态启动的仪表板 我让用户能够将保存的状态加载到仪表板中 当他们单击 应用 按钮时 我运行以下代码 function CloseAndSave var radUpload find radUpload1ID var in
  • 如何使用 LINQ2SQL 连接两个不同上下文的表?

    我的应用程序中有 2 个数据上下文 不同的数据库 并且需要能够通过上下文 B 中的表的右连接来查询上下文 A 中的表 我该如何在 LINQ2SQL 中执行此操作 Why 我们正在使用 SaaS 产品来跟踪我们的时间 项目等 并希望向该产品发
  • 在一个平台上,对于所有数据类型,所有数据指针的大小是否相同? [复制]

    这个问题在这里已经有答案了 Are char int long 甚至long long 大小相同 在给定平台上 不能保证它们的大小相同 尽管在我有使用经验的平台上它们通常是相同的 C 2011 在线草稿 http www open std
  • 具有交替类型的可变参数模板参数包

    我想知道是否可以使用参数包捕获交替参数模式 例如 template
  • 如何在 Xaml 文本中添加电子邮件链接?

    我在 Windows Phone 8 应用程序中有一些大文本 我希望其中有电子邮件链接 例如 mailto 功能 这是代码的一部分
  • 如何禁用 fread() 中的缓冲?

    我正在使用 fread 和 fwrite 读取和写入套接字 我相信这些函数用于缓冲输入和输出 有什么方法可以在仍然使用这些功能的同时禁用缓冲吗 Edit 我正在构建一个远程桌面应用程序 远程客户端似乎 落后于服务器 我不知道可能是什么原因
  • 将 MQTTNet 服务器与 MQTT.js 客户端结合使用

    我已经启动了一个 MQTT 服务器 就像this https github com chkr1011 MQTTnet tree master例子 该代码托管在 ASP Net Core 2 0 应用程序中 但我尝试过控制台应用程序 但没有成
  • C++ 函数重载类似转换

    我收到一个错误 指出两个重载具有相似的转换 我尝试了太多的事情 但没有任何帮助 这是那段代码 CString GetInput int numberOfInput BOOL clearBuffer FALSE UINT timeout IN
  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类
  • 方法优化 - C#

    我开发了一种方法 允许我通过参数传入表 字符串 列数组 字符串 和值数组 对象 然后使用这些参数创建参数化查询 虽然它工作得很好 但代码的长度以及多个 for 循环散发出一种代码味道 特别是我觉得我用来在列和值之间插入逗号的方法可以用不同的
  • 无法接收 UDP Windows RT

    我正在为 Windows 8 RT 编写一个 Windows Store Metro Modern RT 应用程序 需要在端口 49030 上接收 UDP 数据包 但我似乎无法接收任何数据包 我已按照使用教程进行操作DatagramSock
  • WebSocket安全连接自签名证书

    目标是一个与用户电脑上安装的 C 应用程序交换信息的 Web 应用程序 客户端应用程序是 websocket 服务器 浏览器是 websocket 客户端 最后 用户浏览器中的 websocket 客户端通过 Angular 持久创建 并且
  • Oracle Data Provider for .NET 不支持 Oracle 19.0.48.0.0

    我们刚刚升级到 Oracle 19c 19 3 0 所有应用程序都停止工作并出现以下错误消息 Oracle Data Provider for NET 不支持 Oracle 19 0 48 0 0 我将 Oracle ManagedData
  • 如何从 ODBC 连接获取可用表的列表?

    在 Excel 中 我可以转到 数据 gt 导入外部数据 gt 导入数据 然后选择要使用的数据源 然后在提供登录信息后 它会给我一个表格列表 我想知道如何使用 C 以编程方式获取该列表 您正在查询什么类型的数据源 SQL 服务器 使用权 看

随机推荐

  • 将ARFrame捕获的图像转换为UIImage方向问题

    我想检测球并让 AR 模型与其交互 我使用 opencv 进行球检测并发送球中心 我可以在其中使用hitTest获取坐标sceneView 我一直在转换CVPixelBuffer to UIImage使用以下函数 static func c
  • 如何导航到 IntelliJ 中的类型?或者相当于 Eclipse 的 Ctrl + Shift + T 的是什么?

    In Eclipse the Open Type dialog Ctrl Shift T allows you to open any type including those that are in jar dependencies Wh
  • STintersects() 查找交点

    我有两个sql服务器geometry ies 我用来检查它们是否相交 如果他们这样做我需要交叉点 目前我只能得到布尔输出 如果它intersects 1如果它不相交 就会给出 0 有什么方法可以找到两个形状的交集geometry Updat
  • 如何更改 Play Framework 中的模板引擎?

    我如何更改 Play 中的模板引擎 使用与默认引擎不同的引擎 你能给个例子吗 我什至不问你为什么要这样做 很简单 Play即可返回Result您将提供任何内容 因此您可以轻松使用 return ok h1 Code rendered fro
  • Delphi - 线程不以 ActiveX 形式执行 - 但在其他地方执行

    我有一个线程 称为 TAlertThread 线程通过触发事件与其所有者进行交互 例如 当线程内某些数据可用时 它会设置一些临时变量并调用 Synchronize UpdateAlert 后者又会触发相应的事件 现在该线程可以在任何标准 W
  • 签署未签名的程序集

    最近NHibernate 2 1的升级带来了一个非常头疼的情况 到表面 似乎大多数项目默认构建为签名程序集 为了 示例 FluentnHibernate 引用密钥文件 Fluent snk Nhibernate search 构建未签名的内
  • 在逗号、点、连字符或其他特殊字符上断开长无空格行

    我正在尝试在小屏幕 手机 上显示各种文本文本是合理的 但碰巧有一行包含长单词 公式 字符串 不适合 有这样的可能断字 打破所有 但它断线太随意了 我需要一个中间解决方案 如下所示 http jsfiddle net Jsa5t http j
  • 谁使用实时 Java? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我注意到实时Java https en wikipedia org wiki Real time Java2 2 早在 9 月份就发布了 与我上
  • 为什么 WmiPrvSE.exe 持有我的进程作业对象的句柄?

    我有一个 NET 应用程序 它生成多个子 工作进程 我使用 Windows 作业对象 API 和 JOB OBJECT LIMIT KILL ON JOB CLOSE 设置来确保在父进程终止时子进程始终被终止 但是 我观察到在父进程关闭后
  • Docker 容器发布的端口无法访问?

    所以情况是这样的 我有一个使用这个 dockerfile 构建的容器正在运行 FROM python 2 onbuild EXPOSE 8888 CMD nohup mock server dir usr src app 我用这个命令运行它
  • origin/branch_name 和branch_name 之间的区别?

    用于推送到位桶 如果我做 git push origin origin branch name我的提交没有被推送 Total 0 delta 0 reused 0 delta 0 If I do git push origin branch
  • 如何将页面加载到页面中间(而不是顶部)?

    我希望页面在页面中间的某个 div 处打开 而不是在顶部 我有类似的东西 div div div div div div 如何让页面在 d4 而不是顶部打开 除了在 URL 末尾添加 d4 我想一定有一些简单的方法可以做到这一点 但我不知道
  • 如何在 Xamarin.Forms 的 MainPage 上创建动态按钮列表?

    我正在创建一个应用程序来扫描条形码门票 当您启动应用程序时 屏幕上必须显示可用节目的列表 为了获取所有可用的节目 我正在使用一个网络服务 它会返回一个List
  • 使用临时数组作为左值

    这个程序的格式不正确 struct X int i int main X i 1 i 临时的子对象X 不能用作左值 因为X 是一个右值 然而 这会用 GCC 5 2 1 进行静默编译 并且 Wall using Y int 10 int m
  • 替换 Markdown 文本中的占位符(变量)的最简单方法?

    我需要一种开放格式来以通用方式 使用占位符 变量 编写故事 为了使故事具体化 我想设置一个键 值对列表并在发布时应用它们 我还想将样式与内容分开 这样我就可以轻松发布到网络 pdf 等 例子 varname is a great place
  • 从大文件中查找唯一值

    我有一个大文件 比如 10 TB 其中包含 MD5 哈希流 其中包含重复项 我的内存为 10MB 非常有限 硬盘空间不受限制 使用给定条件查找所有唯一的哈希值 消除重复项 请帮忙 这显然不是一个家庭作业问题 您可以使用外部排序算法 例如使用
  • 如何过滤 Room 中的嵌套关​​系?

    让我们举个例子 我有一个表格 其中有几个部分 每个部分都有问题 侧面 我有映射到问题的答案 并且它们还有我想在查询时过滤的另一列 所以我有以下实体 Entity tableName sections public class Section
  • Qt宏关键字导致名称冲突

    我正在为我的 Qt 项目构建 NCurses 界面 我想使用 CDK 但我认为signals该结构的成员与 Qt 发生冲突signals关键词 usr include linux cdk h 411 error expected unqua
  • SQL - 如果行数大于则插入

    我创建了一个 SQL 查询 该查询将从 Oracle 链接服务器返回行 例如 该查询工作正常 将返回 40 行 我希望仅当返回的行数大于 40 时才将结果插入到表中 我的想法是 我可以创建一个触发器来发送一封电子邮件 告知该号码已被泄露 D
  • 从 C# 调用包含函数指针的 DLL 函数

    我有一个用 C 编写的 DLL 其中包含导出函数 该函数具有用作回调函数的函数指针 C DllExport unsigned int DllFunctionPointer unsigned int i unsigned int TimesT