jjzjj

Invoke-SSHCommand

全部标签

c# - 如何制作从 C# "Thread-safe"调用的 C (P/invoke) 代码

我有一些使用单个全局变量的简单C代码。显然这不是线程安全的,所以当我在C#中使用P/invoke从多个线程调用它时,事情就搞砸了。如何为每个线程单独导入此函数,或使其成为线程安全的?我尝试声明变量__declspec(thread),但这导致程序崩溃。我还尝试制作一个C++/CLI类,但它不允许成员函数是__declspec(naked),我需要(我正在使用内联汇编)。我在编写多线程C++代码方面经验不足,因此可能缺少某些内容。下面是一些示例代码:C#[DllImport("MyDll.dll",CallingConvention=CallingConvention.Cdecl)]pu

c# - 等效于 Dispatcher.Invoke 或 Dispatcher.RunAsync 的可移植类库

在.NET、Windows8和WindowsPhone7中,我有类似这样的代码:publicstaticvoidInvokeIfRequired(thisDispatcherdispatcher,Actionaction){if(dispatcher.CheckAccess()){action();}else{dispatcher.Invoke(action);}}我将如何在可移植类库中做一些事情?最好有一个与平台无关的实现。我的想法是使用WP7中不可用但肯定会很快的TPL。//PortableDispatchermustbecreatedontheUIthreadandthenmad

c# - Dispatcher.Invoke with anonymous delegate 在 Silverlight 中有效但在 WPF 中无效

在Silverlight4中,我有一个自定义服务类,它有一个异步的Completed事件。在Completed事件中,我获取返回的数据并通过如下方式调用填充方法:privatevoidservice_Completed(objectsender,CompletedEventArgsargs){Dispatcher.BeginInvoke(()=>populateInbox(args.Jobs));}privatevoidpopulateInbox(Listjobs){inbox.DataContext=jobs;}BeginInvoke在SL4中工作,但是当我将它移植到WPF时,出现以

c# - 在 Pipeline.Invoke 抛出后在 C# 中捕获 Powershell 输出

我正在从C#应用程序运行Powershell测试脚本。由于错误的cmdlet导致pipe.Invoke()引发异常,脚本可能会失败。我能够捕获我需要的有关异常的所有信息,但我希望能够显示脚本到那时为止的输出。我没有任何运气,因为在抛出异常时结果似乎为空。有什么我想念的吗?谢谢!m_Runspace=RunspaceFactory.CreateRunspace();m_Runspace.Open();Pipelinepipe=m_Runspace.CreatePipeline();pipe.Commands.AddScript(File.ReadAllText(ScriptFile));

c# - 通过 P/Invoke 调用 GetGUIThreadInfo

我想将键盘输入发送到另一个进程中的窗口,而不将该窗口置于前台。我可以使用PostMessage伪造WM_KEYDOWN和WM_KEYUP;我只需要知道哪个窗口句柄应该接收键盘输入——即类似GetFocus的东西,但对于另一个非事件应用程序。GetGUIThreadInfoAPI看起来很有前途——它为另一个应用程序返回一个hwndFocus。但是我没有运气让它在我的64位操作系统上从C#运行。我已经复制(然后进一步调整)来自pinvoke.net的声明,但我得到的只是一个通用错误代码(下面有更多详细信息)。我在调用GetGUIThreadInfo之前设置了cbSize,因此我避免了最明显

c# - P/Invoke 到 Mono 上动态加载的库

我正在编写一个使用一些非托管代码的跨平台.NET库。在我的类的静态构造函数中,检测到平台并从嵌入式资源中提取适当的非托管库并保存到临时目录,类似于anotherstackoverflowanswer中给出的代码。.为了在库不在PATH中时可以找到它,我在将它保存到临时文件后显式加载它。在Windows上,这适用于来自kernel32.dll的LoadLibrary。我正尝试在Linux上对dlopen执行相同的操作,但在稍后加载P/Invoke方法时出现了DllNotFoundException。我已验证库“libindexfile.so”已成功保存到临时目录,并且对dlopen的调用

c# - 将 .NET P/Invoke 代码组织到 Win32 API 的最佳实践

我正在.NET中重构一个庞大而复杂的代码库,它大量使用P/InvoketoWin32API。项目的结构不是最好的,我发现到处都是DllImport语句,经常重复相同的功能,并且还以多种方式声明:导入指令和方法有时声明为公共(public)的,有时声明为私有(private)的,有时声明为静态的,有时声明为实例方法。我担心重构可能会产生意想不到的后果,但这可能是不可避免的。是否有我可以遵循的记录在案的最佳做法可以帮助我解决问题?我坚持要组织一个静态/共享的Win32P/InvokeAPI类,在一个文件中列出所有这些方法和关联的常量...编辑user32DLL有超过70个导入.(代码库由2

c# - 多个 Control.BeginInvoke/Invoke 调用会按顺序执行吗?

我需要知道Control.BeginInvoke和Control.Invoke调用是否会按照它们被调用的顺序执行。我有以下场景:UI线程被阻塞WCF线程调用Control.BeginInvokeWCF线程调用Control.Invoke(或可能再次调用BeginInvoke)UI线程未阻塞??步骤1-4的执行顺序保证按照显示的顺序(从技术上讲,顺序不能保证是那样,但我的问题只有在顺序如图所示时才相关)。我的问题是第3步中的Invoke/BeginInvoke调用是否有可能在第2步中的BeginInvoke调用之前执行?此外,请不要评论阻​​塞UI线程。 最佳

c# - P/Invoke 动态 DLL 搜索路径

我有一个现有的应用程序,它P/调用与应用程序本身位于同一目录中的DLL。现在(由于佳能生产了最糟糕的API之一)我需要支持该API的两个版本并在运行时确定我应该使用哪一个(旧的或新的)。由于DLL具有相同的名称(第一个加载具有相同名称的其他DLL,因此仅重命名第一个对我没有帮助)我必须将它们保存在不同的目录中。因此我的问题是:我必须使用哪些选项来控制DllImport声明中给出的DLL使用的目录?我想我可以从尝试这两个想法中的任何一个开始:1)在执行第一个P/Invoke之前使用“SetDllDirectory”设置我想要的目录,然后在之后重置它。2)使用“LoadLibraryEx”

c# - Control.Invoke 输入参数

根据我在C#中的发现,Control.Invoke方法要求您使用不带输入参数的委托(delegate)。有没有办法解决?我想调用一个方法来从另一个线程更新UI并将字符串参数传递给它。 最佳答案 您使用的是哪个版本的C#?如果您使用的是C#3.5,则可以使用闭包来避免传入参数。使用C#3.5publicstaticclassControlExtensions{publicstaticTResultInvokeEx(thisTControlcontrol,Funcfunc)whereTControl:Control{returncont