C#应用程序到C++ dll通过回调返回到C#应用程序
我正在编写调用C ++ DLL的C#应用​​程序.该DLL是成像系统的设备驱动程序.当获取图像时,可以逐行从库中获得图像的预览. C ++ DLL需要回调以填写预览,该回调基本上由最终图像的大小,当前扫描线和数据线本身组成. 问题是,从扫描停止和C#回调停止获取信息的时间起,有很大的延迟.程序的流量类似: 将回调从C# 内部分配给C ++ DLL 用户开始获取数据 设备启动 DLL几秒钟后开始拨打回调 设备完成图像形成 dll仍在调用图像形成时间的两倍的回调. 此相同的DLL与C ++应用程序一起使用,良好;似乎没有最后一步延迟.但是,在C#中,如果我有回调立即返回,则延迟仍然存在;无论我在回调中做什么,都在那里. 这种延迟是从非托管代码调用托管代码的固有限制,还是任何方面都可以做些什么来使其更快?我正在与C ++库作家接触,因此可以从C ++方面实现修复程序. 编辑:可以做一些简单的操作,例如命名的管道工作吗?应用程序可以从自己的管道上读取吗?
0 2024-04-16
编程技术问答社区
C++回调,将文本发回给C#
我是C ++的新手.我被告知使用C ++使用"回调"是最好的解决方案.这是我的情况. 我有C ++写的DLL 此DLL具有启动通过C#代码运行的服务的方法(这可以正常工作) 当DLL中的服务运行时,我希望DLL将文本传递给C#代码,这只是进度代码,例如"阶段第一启动"和"阶段第一" 我环顾四周,并被告知实现这一目标的最佳方法是使用回调,我真的不知道如何实施此功能.我可以检查任何建议或文章吗?请包括C ++,因为我在C ++方面的经验为零. 欢呼 解决方案 您可以简单地将C#字符串传递回C ++,然后将C ++字符串传递给C#.要求是字符串是Unicode,分配方法是Sysallocstring而不是Malloc.您需要转换为Unicode的任何ASCII字符串. const wchar_t* theString = L"hello"; BSTR bstr = SysAllocString(theString); DoSomething(bstr); S
0 2024-04-16
编程技术问答社区
非静态回调如何在本地代码中工作?
问这个问题有点奇怪,因为我的代码似乎不起作用,但确实有效,尽管我没有抱怨,但我想确认为什么?大声笑 简单地说,我有一个C ++本机DLL(根本没有CLR/托管支持),该DLL从C#代码中进行了呼叫.本机侧存储一个由C#侧提供的stdcall回调函数.我一直认为(在C#中)的回调方法必须是静态的,但是非静态和lambda表达式都很好!如何从本机代码填写"这个"指针?我一直认为本地代码仅存储非实体函数指针? 现在,我确实找到了一篇文章,其中有人将IL代码发射到本机和非静态托管回调之间"桥接".我还注意到了这种贬值的方法:"元帅.该方法不再支持,我认为这意味着它是内置的? 问题摘要: 现在通过发射IL代码而将其本地构建到.NET中?如果是这样,在哪个版本的.NET上得到了本地支持? 也在单声道中支持隐含的" thunking"? 当IL发出托管回调时,会发生什么 thunk指的实例已删除?是删除IL的,还是 可以这么说,这可能导致记忆"泄漏"? 谢谢.
0 2024-04-15
编程技术问答社区
C#包装器和回调
我正在为Dallmeier Common API Light(相机和Surviellance Systems)编写C#包装器,并且我以前从未写过包装器,但我使用了Canon Edsdk C#包装器.因此,我正在使用佳能包装器作为编写Dallmeier包装器的指南. 我目前在包装回调方面遇到问题.在API手册中,它具有以下内容: dlm_connect int(unsigned long uLWindowHandle, const char * strIP, const char* strUser1, const char* strPwd1, const char* strUser2, const char* strPwd2, void (*callback)(void *pParameters, void *pResult, void *pInput), void * pInput
0 2024-04-15
编程技术问答社区
非静态回调如何在本地代码中工作?
问这个问题有点奇怪,因为我的代码似乎不起作用,但确实有效,尽管我没有抱怨,但我想确认为什么?大声笑 简单地说,我有一个C ++本机DLL(根本没有CLR/托管支持),该DLL从C#代码中进行了呼叫.本机侧存储一个由C#侧提供的stdcall回调函数.我一直认为(在C#中)的回调方法必须是静态的,但是非静态和lambda表达式都很好!如何从本机代码填写"这个"指针?我一直认为本地代码仅存储非实体函数指针? 现在,我确实找到了一篇文章,其中有人将IL代码发射到本机和非静态托管回调之间"桥接".我还注意到了这种贬值的方法:"元帅.该方法不再支持,我认为这意味着它是内置的? 问题摘要: 现在通过发射IL代码而将其本地构建到.NET中?如果是这样,在哪个版本的.NET上得到了本地支持? 也在单声道中支持隐含的" thunking"? 当IL发出托管回调时,会发生什么 thunk指的实例已删除?是删除IL的,还是 可以这么说,这可能导致记忆"泄漏"? 谢谢.
0 2024-04-15
编程技术问答社区
从C++回调到C#函数的访问违例/崩溃
所以我有一个本机的第三方C ++代码库,我正在使用(.lib和.hpp文件),我用来在C ++/CLI中构建包装器,以最终在C#中使用. 在从调试到发布模式下切换时,我遇到了一个特定的问题,因为当回调的代码返回时,我会遇到访问违规例外. 来自原始HPP文件的回调函数格式的代码: typedef int (*CallbackFunction) (void *inst, const void *data); 来自C ++/CLI包装器的代码,用于回调功能格式: (我会解释为什么我稍后宣布两个) public delegate int ManagedCallbackFunction (IntPtr oInst, const IntPtr oData); public delegate int UnManagedCallbackFunction (void* inst, const void* data); - 很快,我宣布第二个" UnmanagedCallba
0 2024-04-15
编程技术问答社区
如何在收到异步函数的回调之前休眠一个线程?
我只有在从异步函数中收到回调时才需要执行一个函数. 喜欢 我称异步函数Stop(),此后不久,我称之为异步函数Start(). 收到停止回调之前的问题Start()被调用,因此我会遇到问题.另外,我不能像无法执行此操作一样分开两个函数的调用.: public void SomeFunction() { Stop(); } public void Stop_CallBack(eventargs e) { Start(); } 我必须这样做: public void SomeFunction() { Stop(); //Do something; Start(); } 但是,在我收到停止回电之前,执行了我的start()函数,从而为我创造问题. 任何人都可以帮助我解决这个问题. 解决方案 这是您要使用等待手柄的时候.这是一个简短的代码示例,可以显示一种方法: class AsyncDemo {
0 2024-04-15
编程技术问答社区
如何将python回调传递给c#函数调用
我正在尝试使用python的C#类,在单声道/ubuntu上使用python.net. 到目前为止,我设法使用一个参数工作进行了一个简单的函数调用.我现在要做的是将python回调传递给C#函数调用. 我尝试了以下以下变体,无效.有人可以展示如何使该工作吗? // C# - testlib.cs class MC { public double method1(int n) { Console.WriteLine("Executing method1" ); /* .. */ } public double method2(Delegate f) { Console.WriteLine("Executing method2" ); /* ... do f() at some point ... */ /* also tried f.DynamicInvoke() *
0 2024-04-15
编程技术问答社区
如何给Dispatcher.BeginInvoke的回调函数。
我需要使用回调函数来完成一些以dispatcher.begininvoke完成功能开始时执行一些后期任务.但是,我在dispatcher.begininvoke中找不到任何参数来接受回调.是否可以给dispatcher.begininvoke提供回调函数? 解决方案 DispatcherOperation BeginInvoke返回的对象上有Completed事件.订阅该完成后执行操作: var dispatcherOp = Dispatcher.BeginInvoke( /* your method here */); dispatcherOp.Completed += (s, e) => { /* callback code here */ }; 您有机会在您订阅之前完成该操作,因此您也可以测试Status属性以进行完成: if (dispatcherOp.Status == DispatcherOperationStatus.Completed) { ...
0 2024-04-15
编程技术问答社区
捕捉异步回调中抛出的异常
我有一种方法,可以采用回调参数以异步执行,但是捕获块似乎并没有抓住同步呼叫引发的任何例外(this.Submit是指同步方法). ). public void Submit(FileInfo file, AnswerHandler callback) { SubmitFileDelegate submitDelegate = new SubmitFileDelegate(this.Submit); submitDelegate.BeginInvoke(file, (IAsyncResult ar) => { string result = submitDelegate.EndInvoke(ar); callback(result); }, null); } 有没有办法捕获新线程抛出的异常并将其发送到原始线程?另外,这是处理异步异常的"正确"方法?我编写了我的代码,以便可以这样称呼(假设异常问题已解决): t
0 2024-04-15
编程技术问答社区
绑定函数(委托)参数
我试图在不使用lambda函数的情况下实现以下内容: Func test = () => RunSomething("test"); test = bind(RunSomething, "test"); Bind(Func func, T arg) { return () => func(arg); } 以及与更多参数的功能的一些过载: public Func
0 2024-04-15
编程技术问答社区
C#中的回调
我想拥有一个库,它将在其中接受一个函数,该函数接受其参数的对象. 使用此对象,我希望能够在X完成后调用指定的功能.将被称为呼叫者指定的功能,x将由库执行和监视. 我该怎么做? 供参考,我正在使用C#和.NET 3.5 解决方案 为您提供两个选项: 让该函数接受委托( 使用接口 使用委托/lambda public static void DoWork(Action processAction) { // do work if (processAction != null) processAction(); } public static void Main() { // using anonymous delegate DoWork(delegate() { Console.WriteLine("Completed"); }); // using Lambda DoWork(() => Console.Wr
0 2024-04-14
编程技术问答社区
在哪里定义基于任务的异步方法的回调?
以下这个问题,我正在尝试实现异步使用TPL的方法,并尝试遵循点击指南. 我希望我的异步方法在完成后执行回调.据我所知,有三种方法可以做到这一点. 1)在我的任务委托中手动回调 public Task DoWorkAsync(DoWorkCompletedCallback completedCallback) { return Task.Factory.StartNew( { //do work //call callback manually completedCallback(); }); } 2)在任务委托中将回调分配给任务 public Task DoWorkAsync(DoWorkCompletedCallback completedCallback) { return Task.Factory.StartNew( { //do work
0 2024-04-14
编程技术问答社区
如何在回调中获得传递给异步方法的参数
我需要一个在callbackmethodsendregistration中传输到异步的标签. private delegate ResponceFromServer AsyncSendRegistrationDelegate(RegistrationToUser registrationToUser, Label label); private ResponceFromServer AsyncSendRegistrationMethod(RegistrationToUser registrationToUser, Label label) { SetText(label, registrationToUser.Name + " registration..."); return Requests.DataBase.Authorization.Registration( registrationToUser.Name, regi
0 2024-04-14
编程技术问答社区
从inno Setup中调用C# dll并进行回调
我有一个正在运行的Inno设置脚本,其中我使用此dll包装了我的过程,以便可以将其传递给c#dll. 我不想使用此dll,我想直接调用我的导出的C#方法并将其传递给回调过程. 我的问题是: 如何将我的INNO设置过程(@mycallback)传递给我的C#DLL,以便可以将其用作我的delegate/UnmanagedFunctionPointer? 正如我所说的那样有效的,但是我想使用尽可能少的外部DLL. 这是我的代码: Inno设置脚本 type TTimerProc=procedure(); TProgressCallback=procedure(progress:Integer); function WrapProgressProc(callback:TProgressCallback; paramcount:integer):longword; external 'wrapcallback@files:innoc
2 2024-04-13
编程技术问答社区
在WCF Windows服务中,当前的OperationContext为空
我正在尝试使用WCF设置发布/订阅系统,以及Windows服务中WCF服务器的位置.绑定为net.tcp.该服务正在向客户端提供"订阅"方法,以便客户端可以将回调处理程序注册到将从链接到服务器的DLL提出的事件.在"订阅方法"中,我尝试使用OperationContext.Current.GetCallbackChannel方法获取回调通道.当我尝试此操作时,corterContext.current属性返回null. 任何人都可以在什么情况下告诉我这个属性将返回null?我错过了设置吗?我将在下面包括服务代码和接口代码.我在2012年Visual Studio中使用C#,定位框架4.5. 服务: namespace WService { [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] public class WcfPublisherService : IWcfPublis
0 2024-04-13
编程技术问答社区
回调功能
我有一种称为函数的方法,当我使用C#中的beceive套接字方法时,我想将其作为回调函数. . s.BeginReceive(buffer, 0, buffer.Length, System.Net.Sockets.SocketFlags.None, new AsyncCallback(funct), null); 遇到的错误是: "函数"匹配委托'system.asynccallback' 没有超载 这里可能有什么问题? 解决方案 "函数"必须是具有以下签名的方法: void funct(IAsyncResult ar) { } 其他解决方案 您不能仅使用进行回调的任何方法.该功能必须具有特定的签名(参数列表). 其他解决方案 什么是功能?是代表吗? 如果是,它的签名与Asynccallback委托不兼容. 函数必须是看起来像这样的方法: void SomeMethod(IAsyncResult a
0 2024-04-12
编程技术问答社区
ASP.NET-Ajax.BeginForm OnSuccess的回调与参数
我想向我的onsuccess呼叫添加更多参数(,但请保持Ajax上下文变量). 我所做的是: using (Ajax.BeginForm("Register", new AjaxOptions() { OnSuccess = "new function(arg){HandleBasicForm(arg , 'MyCustomVariable')}", ... JS功能: function HandleBasicForm(ajaxContext , myCustomVariable){ var content = ajaxContext.get_response().get_object(); .... } 但是ajaxContext是无效的. 我该怎么做? 解决方案 由于您使用get_response(),我猜您不使用Unbroustrusive JavaScript的内容(在
0 2024-04-12
编程技术问答社区
对于异步方法的调用,你是否必须调用EndInvoke(或定义一个回调),即使你在它返回时没有任何事情要做。
我在codeproject上找到以下代码段,以异步调用... private void CallFooWithOutAndRefParameters() { // create the paramets to pass to the function string strParam1 = "Param1"; int intValue = 100; ArrayList list = new ArrayList(); list.Add("Item1"); // create the delegate DelegateWithOutAndRefParameters delFoo = new DelegateWithOutAndRefParameters(FooWithOutAndRefParameters); // call the beginInvoke function! IAsyncResult tag = delFoo.BeginInvoke(strParam1, out intVal
0 2024-04-12
编程技术问答社区
如何从C#主机应用程序中执行Javascript回调函数
我正在C#中创建一个应用程序,该应用程序托管了大多数GUI的自定义网页.作为主机,我想提供JavaScript API,以便嵌入式网页可以访问主机应用程序提供的某些服务. 我已经能够使用WebBrowser.ObjectForsripting属性并实现脚本类别来获得此工作的简单案例.这非常适合同步JavaScript调用.但是,主机提供的某些操作长期运行,我想为操作完成时提供回调JavaScript的能力.这就是我遇到麻烦的地方. javaScript: function onComplete( result ) { alert( result ); } function start() { window.external.LongRunningProcess( 'data', onComplete ); } c#: [ComVisible(true)] public class ScriptObject { public void
0 2024-04-12
编程技术问答社区