C++将文本发送回 C# 的回调
我是 C++ 新手。我被告知使用 C++ 的“回调”是最好的解决方案。这是我的情况。
我有一个用 C++ 编写的 DLL
这个 DLL 有一个方法来启动通过 C# 代码运行的服务(这工作正常)
当 DLL 中的服务运行时,我希望 DLL 将文本传递回 C# 代码,这只是进度代码,例如“第一阶段开始”和“第一阶段完成”
我环顾四周,被告知实现这一目标的最佳方法是使用回调,我真的不知道如何实现这一点。有人有什么建议或文章可供我查看吗?请包括 C++,因为我对 C++ 的经验为零。
干杯
I'm new to C++. I have been told using a "callback" with C++ is the best solution for this. Here is my situation.
I have a DLL written in C++
this DLL has a method to start the service which is run via the C# code (this works fine)
when the service in the DLL runs I want the DLL to pass back text to the C# code, this is just progress code such as "stage one starting " and "stage one completed"
I have looked around and been told that the best way to achieve this is to use callbacks, I don't really have a clue how to implement this. Does anyone have any suggestions or articles out there I can check out? Please include C++ as I have zero experience in C++.
Cheers
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
回调只是委托的一种特殊用法。普通模型看起来像这样:
该模型的优点在于任何具有定义的“签名”(参数和返回类型)的方法都可以用作回调。这是一种“松散耦合”的形式,其中代码不依赖于知道对象是什么,只依赖于它做什么,因此可以将该对象交换为另一个对象,而代码不知道其中的差异。
上面的例子都是C#的。当您使用 C++ DLL 中的 extern 函数时,您可能会处理 IntPtr 类型,它是指向该方法的简单指针。在定义该 extern 方法的 C# 接口时,您应该能够将此指针“编组”为委托,因此该方法看起来像普通的 C# 方法。
A callback is simply a particular use of a delegate. The normal model looks something like this:
The beauty of this model is that any method with the defined "signature" (parameters and return type) can be used as the callback. It's a form of "loose coupling", where code isn't dependent on knowing what an object IS, only what it DOES, so that object can be swapped out for another object without the code knowing the difference.
The above example is all in C#. When you're using extern functions from a C++ DLL, you'll probably be dealing with an IntPtr type that is a simple pointer to the method. You should be able to "marshal" this pointer as a delegate when defining the C# interface to that extern method, so the method will look like a normal C# method.
可能有更干净的方法,但以下是我用来使其发挥作用的一些步骤。
定义委托和将其传递给 DLL 的函数。这些参数将被发送回 C# 委托:
创建一个变量来存储委托。确保这不会超出范围。在我的测试中,我发现 GC 会回收它(它没有“意识到”我的 DLL 仍在使用它):
然后在某处初始化它:
然后将它传递给您的 DLL:
并定义将接收的实际方法调用:
DLL 中的代码可能如下所示:
然后 DLL 中的代码可以在需要时使用适当的数据调用它:
There may be cleaner ways, but here are some of the steps I used to make it work.
Define the delegate and the function to pass it to your DLL. The parameters are what will be sent back to the C# delegate:
Create a variable to store the delegate. Make sure this doesn't go out of scope. In my testing, I found that the GC would reclaim it (it wasn't "aware" that my DLL was still using it):
Then initialize it somewhere:
And then pass it to your DLL:
And define the actual method that will receive the call:
The code in the DLL might look like this:
And then the code in your DLL can call it with the appropriate data when it needs:
您可以简单地将 C# 字符串传递回 C++,并将 C++ 字符串传递回 C#。要求是字符串是unicode并且分配方法是SysAllocString而不是malloc。任何需要转换为 unicode 的 ASCII 字符串。
注册 C# dll
并将 Unicode 转换为 ASCII,反之亦然。
.NET 代码:
编辑:
请参阅此处了解更详细的信息:
You can simply pass a C# string back to C++ and a C++ string to C#. The requirement is that the string is unicode and the allocation method is SysAllocString and not malloc. Any ASCII string you need to convert to unicode.
And this to register the C# dll
And this to convert Unicode to ASCII and vice-versa.
And the .NET code:
Edit:
See here for closer information:
这很棘手,但这是代码——我花了一段时间才弄清楚——感谢支持。
你能从 C DLL 调用 C# DLL 吗?< /a>
此示例是非托管 C++ 到 C#。
It's tricky but here's the code -- took me a while to figure out -- upvotes appreciated.
Can you call a C# DLL from a C DLL?
This example is unmanaged c++ to C#.