Tag: 非托管

内存泄漏问题:处置或不处置托管资源?

我在计算昂贵的基于内容的图像检索(CBIR).NET应用程序中遇到奇怪的内存泄漏 概念是有一个带有线程循环的服务类,它捕获来自某些源的图像,然后将它们传递给图像标记线程以进行注释。 服务类以指定的时间间隔从存储库中查询映像标记,并将其存储在其内存缓存(字典)中,以避免频繁的数据库命中。 该项目中的类是: class Tag { public Guid Id { get; set; } // tag id public string Name { get; set; } // tag name: eg ‘sky’,’forest’,’road’,… public byte[] Jpeg { get; set; } // tag jpeg image patch sample } class IRepository { public IEnumerable FindAll(); } class Service { private IDictionary […]

将委托定义为函数指针

我正在使用一个调用非托管函数指针的委托。 这会导致垃圾收集器在使用之前收集它,如MSDN上的CallbackOnCollectedDelegate MDA页面中所述:CallbackOnCollectedDelegate MDA的MSDN页面 。 该决议声明我必须将适当的委托编组为非托管函数指针。 我最初的反应是使用: [MarshalAs(UnmanagedType.FunctionPtr)] public delegate void EntityCallback([MarshalAs(UnmanagedType.SysInt)] IntPtr entity); 但是,C#编译器不会让我编组委托,即使这是MSDN建议的解决方案。 此外,MSDN页面仅显示抛出问题的示例,但不是解决方案之一。 我怎么能将我的委托编组为一个非托管函数指针或阻止它被GCed? 编辑 :根据建议,我创建了回调的引用。 因此,我的代码从/更改为: // From: foo.SetCallback(new EntityCallback(bar)); // To: call = new EntityCallback(bar); // Referenced in class foo.SetCallback(call); 现在这确实有效 – 但仅限于调试模式。 当我切换到Release时,它会在同一点崩溃。 这是为什么? 编辑2 :更完整的代码片段: public class Test { private EntityCallback Call; private void Bar(System.IntPtr target) { … […]

如何在C#中使用XmlSerializer将字节数组序列化为XML?

假设我们有一个结构,它的数据由使用Marshal.PtrToStructure的非托管字节数组提供。 C#结构布局: [StructLayout(LayoutKind.Sequential, Size = 128, CharSet = CharSet.Ansi, Pack = 1)] public struct MNG_Y_Params { public byte Number; public byte Version; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] OliNumber; public byte InterfaceType; } 字节数组表示非托管代码中的(ascii)字符串。 此结构是另一个结构的成员(具有一些其他成员): public struct MyData { public int ID; public StructType structType; [XmlElement(ElementName=”MNG_Y_Params”)] public MNG_Y_Params y_params; [XmlElement(ElementName = “SimpleStruct2”)] public SimpleStruct2 ss2; […]

非非托管类型和托管类型之间有什么区别?

当我为实验目的编写以下代码段时,它引发了hover错误(参见屏幕截图): 无法声明指向非非托管类型的’动态’ 片段: dynamic* pointerToDynamic = &fields; 虽然代码显然不被允许(你不能获取托管类型的地址),但它提出了一个问题:什么是非非托管类型 ,它与托管类型有什么不同? 或者只是Visual Studio试图变得有趣?

中止对非托管DLL的调用

我有一个非托管DLL,如果输入参数是一个很大的值,它可以运行很长时间,有时这是可取的,但并不总是如此。 我如何在c#中调用此函数以便在需要时可以中止它? 到目前为止,我已经尝试将调用放在一个单独的线程中,但是中断和中止似乎都不会停止进程,该进程在100%CPU运行直到dll完成。 是否可以终止正在运行的DLL代码?

如何实现从非托管DLL到.net应用程序的回调接口?

在我的下一个项目中,我想为C ++中已有的代码实现GUI。 我的计划是将C ++部分包装在DLL中并在C#中实现GUI。 我的问题是我不知道如何实现从非托管DLL到manged C#代码的回调。 我已经在C#中做了一些开发,但是托管和非托管代码之间的接口对我来说是新的。 任何人都可以给我一些提示或阅读提示或一个简单的例子从一开始? 不幸的是,我找不到任何有用的东西。