Tag: unmanaged

使用dispose / finalize模式释放套接字/事件/ ummaged代码的正确技术

当我的类包含套接字和事件时,如何实现Dispose模式? 应该是这样的吗? class MyClass { Socket m_ListenerSocket = new Socket(); book m_Disposed=false; public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } private void Dispose(bool isDisposing) { if (!m_Disposed) { if (isDisposing) { if (m_ListenerSocket != null) { m_ListenerSocket.Dispose(); innerClass.Notify -= Notify; } } //finalized unmanged code here m_Disposed = true; } } ~MyClass() { Dispose(false); } } […]

如何通过引用发送字符串来修改该字符串的非托管C库?

我是与非托管库交互的新手。 我有一个非托管的C函数,它通过函数内的引用修改字符串。 我在从C#传递字符串并通过C函数修改它时遇到了麻烦。 这是C函数: __declspec(dllexport) void __stdcall Test(char* name) { *name = “Bar”; } 这是C#DLL导入代码: [DllImport(@”C:/blah/mylibrary.dll”)] public extern static string Test(string name); 这是我用来调用函数的代码: string s = “foo”; Test(s); //I want s to be “Bar” after the above line 我尝试在字符串参数上使用“ref”和“out”,并尝试将编组作为LPStr。 根据我的尝试,我得到一个错误 “作为String传入的指针不能位于进程地址空间的底部64K。” 要么 “试图读取或写入受保护的内存。这通常表明其他内存已损坏。” 我确定我只是用我的指针做一些愚蠢的事情。 有人可以帮我确定合适的C#代码,使“s”等于“bar”吗? 谢谢

如何使用extern“C”dll函数将char **作为C#应用程序中的参数?

我有function的dll: extern “C” int doJob(char** buffer); 它在C ++中的用法如下所示: char* buf; int status = doJob(&buf); 我应该在C#中为此函数定义什么? 如何在C#中使用此function?

C#组件事件?

我正在尝试编写一个C#组件,它将公开事件。 该组件将由非托管C ++应用程序导入。 根据一些教程我已经提出了这个代码(对于C#方面): namespace COMTest { [ComVisible(true), Guid(“02271CDF-BDB9-4cfe-B65B-2FA58FF1F64B”), InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] public interface ITestEvents { void OnTest(); } [ComVisible(true), Guid(“87BA4D3A-868E-4233-A324-30035154F8A4”)] public interface ITest { void RaiseTest(); } // End of ITest [ComVisible(true), Guid(“410CD174-8933-4f8c-A799-8EE82AF4A9F2”), ClassInterface(ClassInterfaceType.None), ComSourceInterfaces(typeof(ITestEvents))] public class TestImplimentation : ITest { public TestImplimentation() { } public void RaiseTest() { if (null != OnTest) OnTest(); } public […]

如何在从C到C#的结构中获得非托管可变长度C数组?

如何返回MIB_IPFORWARDROW数组? struct MIB_IPFORWARDTABLE { public uint Size; [MarshalAs(/* what goes here? */)] public IPFORWARDROW[] Table; }; [DllImport(“iphlpapi”, CharSet = CharSet.Auto)] private static extern int GetIpForwardTable( IntPtr /* MIB_IPFORWARDTABLE* */ pIpForwardTable, ref uint /* ULONG* */ pdwSize, bool bOrder); public static MIB_IPFORWARDROW[] Temp() { var fwdTable = IntPtr.Zero; uint size = 0; var result = GetIpForwardTable(fwdTable, […]

如何从C#导入和使用非托管C ++类?

我有一个原生的C ++ DLL,一些头文件和导入库。 有没有办法如何在dll中定义的C#中实例化对象? 我所知道的两种方式是: 将C ++代码包装到COM中 使用DLLImport和外部C函数

使用数组的非托管导出

我正在使用RGiesecke DLLExport库生成一个可以从Delphi动态加载的C#DLL。 我有一个方法,如: [DllExport(“GetVals”, CallingConvention = System.Runtime.InteropServices.CallingConvention.StdCall)] static void GetVals([In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] int[] valueList, int len) { valueList = new int[3]; int[] arrList = new int[] { 1, 2, 3 }; int idx = 0; foreach (int s in arrList) { valueList[idx] = s; idx++; } } 我希望能够从这个调用中返回一个数组,问题是我不会事先知道数组的大小,这只会在RunTime中确定。 测试我做了以下(也在C#中) IntPtr hLibrary = […]

将C dll代码编组到C#中

我在dll中有以下C代码签名: extern __declspec(dllexport) unsigned char * funct_name (int *w, int *h, char **enc, int len, unsigned char *text, int *lp, int *mp, int *ep) C函数可以修改w,h,enc,lp,mp和ep(虽然后三者可以为null,但它不会做任何事情。 我在C#中使用以下内容 [DllImport(“iec16022ecc200.dll”, EntryPoint = “iec16022ecc200”, ExactSpelling = false, CharSet = CharSet.Ansi, SetLastError = true, CallingConvention=CallingConvention.Cdecl)] static extern IntPtr CallEncode( [In,Out,MarshalAs(UnmanagedType.LPArray)] Int32[] width, [In,Out,MarshalAs(UnmanagedType.LPArray)] Int32[] height, [In,Out,MarshalAs(UnmanagedType.LPStr)] ref StringBuilder encoding, int […]

C#涉及多个项目时的非托管出口(Robert Giesecke)

我有这种情况,我需要在.Net中创建一个可以从delphi程序调用的非托管DLL。 我一直在做一些研究,我找到了Robert Giesecke的图书馆(RGiesecke.DllExport)。 我从一个非常简单的DLL开始,它显示一个带有文本框的窗体,如下所示: [ComVisible(true)] [DllExport(“PlaceOrder”, CallingConvention = CallingConvention.StdCall)] public static IntPtr PlaceOrder(IntPtr lnpInXml) { string inputXml = Marshal.PtrToStringAnsi(lnpInXml); StringBuilder sbOutputXml = new StringBuilder(); Form1 pti = new Form1(inputXml, sbOutputXml); pti.ShowDialog(); return Marshal.StringToHGlobalAnsi(sbOutputXml.ToString()); } 这工作正常,我设置delphi程序来调用我的DLL,它工作得很好。 当我在我的解决方案中添加对另一个项目的引用并在该项目中创建对象的实例时,问题就出现了。 此时,delphi程序停止显示表单,就像它找不到导出的函数但它不会抛出任何错误: using MyCommonCode; namespace UnmanagedDLLTest { [ComVisible(true)] public static class UnmanagedDLL { [ComVisible(true)] [DllExport(“PlaceOrder”, CallingConvention = CallingConvention.StdCall)] public static […]

是否可以使用托管代码中的C#reflection调用非托管代码?

是否有可能使用reflection和C#.NET在.NET发布之前调用动态不同的函数(带参数)来编写C或C ++(非托管代码)? 和smole C#示例如果可能的话将不胜感激! 谢谢! Br,米兰。