Tag: pinvoke

在C#中使用本机dll中的c ++类

我花了大约3天时间阅读这个主题…… 由于许多教程并回答了有关如何创建本机DLL的问题,我现在完全迷失了。 如果你有空闲时间,请小心解释一下这个话题,并帮助我 – 如果你没有时间,那就去那里我的问题的简单forms…… 以下是我目前对该主题的了解: 1)我需要在类名之前使用定义为__declspec(ddlexport)和__declspec(ddlimport)的宏来导出所有类方法和变量 2)我需要在某处使用extern “C” ,但我不确定到底在哪里 3)有很多方法可以做到这一点(将类作为参数传递给接受它的方法c approch / export class / use interface) 这就是我迷失的原因和方式: 1)大多数教程都是用于导出方法,我怀疑与类相比很容易(在C#中你使用[Dllimport,DLL的名称]然后你调用每个方法) 2)我是否需要在课堂上使用extern “C” ? 3)如果我使用带接口的工厂方法,我是否需要分发包含接口的.h文件? 这是我想要做的: 1)创建一个带有类的C ++ DLL,并导出要在.NET或C ++中使用的类(我想保护我的代码,因为我看到了使用存储的IL可以轻松地反转托管代码。) 2)我想有2个DLL,一个C ++本机DLL,另一个将是包装DLL,所以如果有人想在C ++中使用我的类,他可以直接使用本机DLL,如果他想在C#/ VB.net他可以使用C ++ / CLI包装器DLL … 3)没有libs,没有头文件,没有def文件,……等…..只有纯DLL(2个文件将被释放) 简单的forms 假设我想从这个C ++类中实例化C#中的对象 Class Human { private: int Pee_Meter; public: Void Do_Pee() { //stuff here }; }; […]

在编组带有字符串的struct时出现PInvoke错误

我有一个C ++结构 struct UnmanagedStruct { char* s; // Other members }; 和一个C#结构 struct ManagedStruct { [MarshalAs(UnmanagedType.LPStr)] string s; // Other members } C ++库暴露 extern “C” UnmanagedStruct __declspec(dllexport) foo( char* input ); 而它是导入的 [DllImport(“SomeDLL.dll”, CharSet = CharSet.Ansi)] static extern ManagedStruct foo( string input ); 但是,当我调用此函数时,我得到了 MarshalDirectiveException未处理 方法的类型签名与PInvoke不兼容。 问题是,如果我从结构中删除char * s和字符串s,则此函数调用有效。

如何在C#中使用WM_Close?

任何人都可以提供一个如何使用WM_CLOSE关闭像记事本这样的小应用程序的例子吗?

为什么我的解决方案不适用于C#中的P / Invoke NotifyServiceStatusChange?

我正在尝试P / Invoke C#中的NotifyServiceStatusChange事件来检查服务何时停止。 我设法让它编译并运行没有任何错误,但现在, 当我停止服务时,它似乎不想通知它已死 。 任何想法为什么会这样? 您可以通过将此代码复制到空白控制台应用程序中来测试它; 只需确保将“我的服务名称”替换为您的服务名称(下面有两个此字符串实例)。 using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading; using System.Threading.Tasks; namespace ConsoleApplication1 { class Program { public delegate void StatusChanged(IntPtr parameter); public class SERVICE_NOTIFY : MarshalByRefObject { public uint dwVersion; public StatusChanged pfnNotifyCallback; public IntPtr pContext; public uint dwNotificationStatus; public SERVICE_STATUS_PROCESS […]

来自delphi打包记录的正确结构布局

我正在将delphi应用程序转换为C#。 有一堆打包的记录,根据几周前我问过的类似问题,转换成课程会更好。 但是,我被告知我需要将它们转换为结构体,我可以使用一些帮助。 我将使用BinaryReader从文件中读取并将值分配给结构体内的字段。 *注意,我正在阅读的文件是使用Delphi和打包记录制作的。 这是一个示例结构: delphi: Testrec = packed record now: TDateTime; MinLat: longint; MinLong: longint; Firsttime: TDateTime; MinAlt: single; MinFirst: single; MinDepth: single; MinSpeed: single; MinBot: single; res3: single; res4: single; res5: single; res6: single; MaxLat: longint; MaxLong: longint; Lasttime: TDateTime; MaxAlt: single; MaxFirst: single; MaxDepth: single; MaxSpeed: single; MaxBot: single; res9: single; […]

NullReferenceException,没有堆栈跟踪……从哪里开始?

我有一个WPF音频应用程序。 偶尔(甚至在调试器中)我看到一个NullReferenceException ,它不携带堆栈跟踪信息。 如何开始调试这样的问题? 一些背景: 我在WinMM.dll中调用/调用函数,这涉及在调用waveOutOpen时注册回调 [DllImport(“winmm.dll”)] public static extern MmResult waveOutOpen(out IntPtr phwo, IntPtr uDeviceID, WaveFmt pwfx, WaveCallbk dwCallback, IntPtr dwInstance, int fdwOpen); 事实certificate这很难稳定,特别是在我调用waveOutClose ,并立即再次调用waveOutOpen (通常是为了改变输出格式)。 我怀疑这个问题可能与我上面描述的调用有关(尽管知识很少,我可能完全偏离目标)。 现在certificate重现问题是难以捉摸的,尽管我可以为一直看到这个问题的用户提供构建。 我可能会尝试加快导致问题的操作,以便在调试器中重现问题更加确定。 关于调试器,我没有修改任何设置(包括Enable unmanaged code debugging )或任何Debug -> Exceptions…设置。 说实话,我对这里提供的内容毫无头绪,所以任何提示都是受欢迎的。 exception怎么可能没有堆栈跟踪? 你以前见过这个吗? 救命!

P /通过错位名称调用函数

我试图在windows ce 6.0环境中调用.net cf 3.5中的非托管c ++ dll中的函数。 结构定义为: typedef struct TagOperatorInfo { DWORD dwMode; DWORD dwFormat; //Operator name format DWORD dwAct; //Network type(Available in 3G module£ºGSM or 3G), TCHAR szOper[32]; }OperatorInfo,*LPOperatorInfo; 和函数调用是: BOOL GetCurOperatorInfo(LPOperatorInfo pinfo); 我在.net中定义了TagOperatorInfo,如下所示: [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential, CharSet = System.Runtime.InteropServices.CharSet.Auto)] public struct TagOperatorInfo { /// DWORD->unsigned int public uint dwMode; /// DWORD->unsigned int public uint […]

枚举网络会话

我想从计算机管理 – >共享文件夹 – >会话选项卡中将有关已连接网络用户的数据提取到我的c#应用程序中。 任何人都可以指导我必须使用哪些命名空间以及一些示例代码从计算机管理 – >共享文件夹 – >会话选项卡导入用户名和IP地址? 问候

在c#中编组c结构

我有一个’C”DLL’可以将结构作为输入,我必须从我的c#程序中调用该DLL 以下是我在c中的示例结构,我必须在我的c#代码中编组这些结构 我在做对还是错? 实际C结构: typedef struct procedure { char code[8]; }procedure; typedef struct datefield { char date[10]; }datefield; typedef struct p45_clsgs { procedure p45_clsg; datefield p45_clsgdte; }p45_clsgs; C#: [StructLayout(LayoutKind.Sequential), Serializable] struct procedure { //char code[]; [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 8)] public string code; } [StructLayout(LayoutKind.Sequential), Serializable] struct datefield { //char date[10]; [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 10)] public […]

在c#中使用pinvoke来调用64位的sprintf和朋友

我在C#中使用pinvoke来调用_snwprintf时遇到了一个有趣的问题。 它适用于整数类型,但不适用于浮点数。 这是在64位Windows上,它在32位上运行良好。 我的代码如下,请记住,这是一个人为的例子来展示我所看到的行为。 class Program { [DllImport(“msvcrt.dll”, CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)] private static extern int _snwprintf([MarshalAs(UnmanagedType.LPWStr)] StringBuilder str, IntPtr length, String format, int p); [DllImport(“msvcrt.dll”, CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)] private static extern int _snwprintf([MarshalAs(UnmanagedType.LPWStr)] StringBuilder str, IntPtr length, String format, double p); static void Main(string[] args) { Double d = […]