Tag: unmanaged

反转PInvoke并创建一个完整的非托管C#程序

我知道这是一个奇怪的问题但是这个想法很简单:我更喜欢C#语法而不是C ++:-Setters和getter直接在属性-interfaces -foreach语句中 – 可谓声明隐式转换运算符 其他小东西…… 我真的不知道的是,如果我不使用任何命名空间(甚至是系统),是否可以在C#中导入c ++ dll(特别是std库) 这个想法只是使用你通常在C ++中使用的所有东西编写一个程序(CLR都没有),甚至是printf例如 谢谢你的回答

在后台使用非托管库时无法更新WPF GUI

尝试使用Emgu从网络摄像头捕获图像时,我遇到了一个问题。 为了完成这项任务,Emgu使用非托管opencv库。 所以问题是我无法从System.Timers.Timer Elapsed事件更新我的GUI(WPF图像控件)。 我知道它在不同的线程中运行,但是,嘿,这就是我使用Dispatcher的原因。 这是我第一次无法使用Dispatcher。 获取InvalidOperationException,“调用线程无法访问此对象,因为另一个线程拥有它。”。 我花了一整天时间寻找解决方案,但仍无法解决问题。 任何想法为什么会发生? webcam.OnNewFrame += newBitmapSource => this.imgCaptured.Dispatcher.Invoke ( new Action(delegate { this.imgCaptured.Source = newBitmapSource; }), DispatcherPriority.Background ); Stack Trace的最后一件事是:System.Windows.Threading.Dispatcher.VerifyAccess() 但是,如果我调用Dispatcher.CheckAccess(),则返回true。 更新: 最后我自己发现了:必须在UI Thread上创建BitmapSource。 似乎它不能使用此对象。

GCHandle固定内存/对象多少会使垃圾收集器变慢?

我确信这个答案取决于用户机器,但必须有一些固定数据的最佳实践 。 我需要保存5个字节数组,每个字节包含1.048.576字节。 通常我更喜欢使用GCHandle (托管)内存,但有些人说它会降低GC的速度。 我知道可能会发生这种情况,但需要固定多少内存/对象才能真正影响GC? 以下是我的选择: GCHandle.Alloc GCHandleType.Pinned (托管)。 它会减慢GC ?? Marshal.AllocHGlobal (非管理访问)。 不安全的代码 使用Bitmap在Scan0中保存数据(非托管访问)。 不安全的代码

统一处理非托管API中的错误代码

我正在编写一个包含相当大的非托管API的包装器。 几乎每个导入的方法在失败时都会返回一个常见的错误代码。 现在,我这样做: ErrorCode result = Api.Method(); if (result != ErrorCode.SUCCESS) { throw Helper.ErrorToException(result); } 这很好用。 问题是,我有很多非托管方法调用,这会非常令人沮丧和重复。 所以,我尝试切换到这个: public static void ApiCall(Func apiMethod) { ErrorCode result = apiMethod(); if (result != ErrorCode.SUCCESS) { throw Helper.ErrorToException(result); } } 这允许我将所有这些调用减少到一行: Helper.ApiCall(() => Api.Method()); 然而,这有两个直接的问题。 首先,如果我的非托管方法使用out参数,我必须首先初始化局部变量,因为方法调用实际上是在委托中。 我希望能够简单地声明一个目的地而不初始化它。 其次,如果抛出exception,我真的不知道它来自何处。 调试器跳转到ApiCall方法,堆栈跟踪仅显示包含对ApiCall的调用而不是委托本身的方法。 由于我可以在单个方法中进行许多API调用,这使调试变得困难。 然后我考虑使用PostSharp来包装所有非托管调用以及错误代码检查,但我不确定如何使用extern方法。 如果最终只是为每个人创建一个包装器方法,那么我会ApiCall与ApiCall方法相同的exception问题,对吧? 另外,如果调试器只存在于已编译的程序集中,那么调试器如何知道如何在我的代码中向我显示抛出exception的站点? 接下来,我尝试实现一个自定义封送器,它将拦截API调用的返回值并检查那里的错误代码。 遗憾的是,您无法应用自定义封送程序来返回值。 但我认为如果有效的话,那将是一个非常干净的解决方案。 [return: MarshalAs(UnmanagedType.CustomMarshaler, […]

从C#调用C ++函数 – 不平衡堆栈

我有一个带有以下签名的非托管C ++函数: int function(char* param, int ret) 我试图用C#调用它: unsafe delegate int MyFunc(char* param, int ret); … int Module = LoadLibrary(“fullpathToUnamanagedDll”); IntPtr pProc = GetProcAddress(Module, “functionName”); MyFunc func = (MyFunc)System.Runtime.InteropServices.Marshal.GetDelegateForFunctionPointer(pProc, typeof(MyFunc)); unsafe { char* param = null; int ret = 0; int result = func(param, ret); } 据我所知,从旧的C ++项目规范中, param为null, ret为0都是函数的有效输入。 当我尝试调用它似乎工作,但退出时我得到以下错误: 检测到PInvokeStackImbalance 对PInvoke函数’… :: Invoke’的调用使堆栈失衡。 […]

Asp.net调用C#层调用Managed C ++调用Native C ++

我的项目结构如下: ASP.NET调用C#层调用托管 C ++调用Native C ++ (我试图避免使用互操作因此这就是托管c ++层的原因)我编写unit testing来测试C#层并且它工作正常。 当我尝试运行asp.net页面时,我得到: “Could not load file or assembly…”错误。 我发现当我复制粘贴Native C ++ dll到“Temporary ASP.NET Files”(到相应的文件夹)时,该网站可以工作。 似乎Managed C ++代码只有在它位于同一个文件夹中才能找到Native C ++代码 – 显然我不能在temp文件中拥有Native dll。 有没有办法在全局范围内设置Native(不适用于System32)? 谢谢你的评论。 归结为一个选项: 这是安全问题 我用代码自己设置服务器并在cassini下运行,但是当我发布它(在iis7下运行)我得到“无法加载文件或程序集……”我正在运行IIS7 ApplicationPoolIdentity,.net 4集成非常感谢Pini。

在C#中处理来自非托管dll的exception

我有用C#编写的以下函数 public static string GetNominativeDeclension(string surnameNamePatronimic) { if(surnameNamePatronimic == null) throw new ArgumentNullException(“surnameNamePatronimic”); IntPtr[] ptrs = null; try { ptrs = StringsToIntPtrArray(surnameNamePatronimic); int resultLen = MaxResultBufSize; int err = decGetNominativePadeg(ptrs[0], ptrs[1], ref resultLen); ThrowException(err); return IntPtrToString(ptrs, resultLen); } catch { return surnameNamePatronimic; } finally { FreeIntPtr(ptrs); } } public static string GetNominativeDeclension(string surnameNamePatronimic) { if(surnameNamePatronimic […]

如何强烈命名非托管C ++ Dll?

我正在使用一个C#应用程序,该应用程序使用EasyHook库进行DLL注入。 EasyHook要求使用它的任何应用程序都有很强的名称。 为了强烈命名应用程序,我需要确保我使用的所有库都具有强名称。 这对我的所有托管库都很容易,但我还有一个非托管的c ++库,我需要强烈命名。 经过一些搜索,我似乎无法找到一种方法来签署我的非托管DLL,即使使用源代码。 可以这样做,如果是这样,我还需要做什么? 感谢您的任何建议或帮助!

使用平台Invoke(C#)在非托管代码中分配和释放内存

我想在非托管代码(C ++)中分配和释放内存,我们从托管代码(C#)中将它们称为函数。 我不确定以下代码是否没有内存泄漏? C#代码: [DllImport(“SampleDLL.dll”)] public extern void getString([MarshalAs(UnmanagedType.LPStr)] out String strbuilder); [DllImport(“SampleDLL.dll”)] public extern void freeMemory([MarshalAs(UnmanagedType.LPStr)] out String strBuilder); …. //call to unmanaged code getString(out str); Console.WriteLine(str); freeMemory(out str); C ++代码: extern void _cdecl getString(char **str) { *str = new char[20]; std::string temp = “Hello world”; strncpy(*str,temp.c_str(),temp.length()+1); } extern void _cdecl freeMemory(char **str) { […]

Marshal.PtrToStringUni()vs new String()?

假设我有一个char *类型的指针到unicode字符串,我知道长度: char* _unmanagedStr; int _unmanagedStrLength; 我有2种方法将其转换为.NET字符串: Marshal.PtrToStringUni((IntPtr)_unmanagedStr, _unmanagedStrLength); 和 new string(_unmanagedStr, 0, _unmanagedStrLength); 在我的测试中,两个调用都给出了完全相同的结果,但new string()比Marshal.PtrToStringUni()快1.8倍。 为什么这种性能差异? 这两者之间还有其他function差异吗?