在C#中使用代表作为C Dllimported功能的回调
我正在尝试调用c dll的功能. 但是我得到了一个stackoverflowException,所以我认为该函数作为参数有问题. 详细看起来像这样. c dll(标题文件): typedef struct { MyType aType; /* message type */ int nItems; /* number of items */ const MyItems *lpItem; /* pointer to array of items */ } MyStruct; typedef void (__stdcall *MyCbFunc) (HWND, const MyStruct *); API(BOOL) RegisterCbFunc (ARGS, MyCbFunc); 在C#中我尝试了以下操作: [StructLayout(LayoutKind.Sequential, CharSet = Cha
38 2024-04-26
编程技术问答社区
如何绕过.NET框架4.0中的DnsRecordListFree错误?
我正在做一个mxrecordlookup.在.NET Framework 4.0中调用DNSRECORDLISTFREE时,我会遇到错误.我正在使用Windows 7.如何解决?这是错误: Faulting application name: MxRecordService.exe, version: 1.0.0.0, time stamp: 0x4ce25848 Faulting module name: ntdll.dll, version: 6.1.7600.16559, time stamp: 0x4ba9b802 Exception code: 0xc0000374 Fault offset: 0x00000000000c6df2 Faulting process id: 0x110c Faulting application start time: 0x01cb85f46c1140da Faulting application path: C:\vss\Web\MXRe
10 2024-04-26
编程技术问答社区
试图加载一个格式不正确的程序
我正在使用C#加载C ++ DLL,并收到此错误: "类型'system. "其他信息:试图加载具有错误格式的程序.(Hresult的例外:0x8057000b) 我不知道为什么.使用VS2012向导,Win32应用程序,DLL的DLL生成C ++ DLL.它是使用X64选项构建的.这是代码: // MyNativeDLL.cpp : Defines the exported functions for the DLL application. // #include "stdafx.h" //char* pMemoryBuffer = NULL; using namespace std; __declspec(dllexport) long Test() { long a; a = 1; a++; return a; } C#代码称为: [Dl
44 2024-04-26
编程技术问答社区
在Windows 7 x32下使用c#中的dllimport的问题
iam在C#中导入DLL问题.我在Windows XP X32下创建了库,并尝试在Windows 7 X32上使用它.我的图书馆使用了另一个名为opnecvsharp的库,该库将dllimport用于C ++的OpenCV库. iam确保我将OpenCv.dlls添加到与可执行文件的同一文件夹中.我试图以管理员的身份运行EXE,禁用UAC,在路径变量中添加路径,但是这些都没有帮助我. 我如何使我的程序看到DLL? 图片中的错误显示程序没有看到OpenCV DLL库. OpenCvSharp仅提供DLL,而没有socuce文件,因此我不能在这里粘贴代码如何导入. 解决方案 尽管错误消息报告opencv_core220库缺失,但您坚持认为它与可执行文件中的目录相同.因此,OpenCV依赖性之一似乎是失败的. 最有可能和合理的原因是目标机器上尚未安装视觉C ++重新分布软件包.
12 2024-04-26
编程技术问答社区
我如何在C#上为一个在参数上有双重指示的C++包装方法写一个签名?
我正在为DLL编写包装纸. DLL具有一种方法,其签名类似于以下内容: unsigned long aMethod(char **firstParameter, char **secondParameter)) amethod将字符串指针返回所有参数. 我已经在Google上搜索了一个教程,可以让我了解如何在C#上编写签名,以便框架可以完成编组过程. 怎么写? 您知道有关此主题的任何教程,书籍或文档吗? 解决方案 我得到答案: 签名必须这样: [DllImport(aDll.dll, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Auto)] static unsafe extern ulong aMethod(ref IntPtr firstParameter, ref IntPtr secondParameter); 参数应在此处声明:
12 2024-04-26
编程技术问答社区
使用C#中的非托管C++的麻烦,使用dllimport
我在将C ++的dll导入C#[WinForm]遇到困难.有人可以帮忙吗? 基本上,我只是想在C ++中创建一个字符串的安全性,并试图将其发送到C#. 这是我的C ++代码. extern "C" __declspec(dllexport) BOOL GetStringArr(SAFEARRAY* arr) { SAFEARRAY* myArray; SAFEARRAYBOUND rgsabound[1]; rgsabound[0].lLbound = 0; rgsabound[0].cElements = 5; myArray = SafeArrayCreate(VT_BSTR, 1, rgsabound); VARIANT* pvData = (VARIANT*)(myArray->pvData); pvData[0].vt = VT_BSTR; pvData[0].bstrVal = SysAllocString(L"Fi
20 2024-04-26
编程技术问答社区
GetMessage()给出了一个System.ExecutionEngineException。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; using System.Diagnostics; using System.Threading; namespace WindowsFormsApplication1 { public partial class Form1 : Form { [DllImport("user32.dll")] public static extern bool RegisterHotKey(I
18 2024-04-26
编程技术问答社区
EnumdisPlayDevices()不返回C#中的任何值
在将其标记为重复之前:是的,我尝试了在Stackoverflow上可以找到的所有解决方案,但没有任何帮助. 我正在尝试通过C#设置显示器的显示分辨率.我使用ChangeDisplaySettings()和EnumDisplaySettings()方法从User32.dll> 使用ChangeDisplaySettings()和EnumDisplaySettings()方法来工作. 我的问题现在我不知道如何设置第二个显示器的分辨率.我尝试通过EnumDisplayDevices()方法获取设备名称,但是我要获得的只是以下输出:DeviceName =\ Monitor name =重复多次. 下面可以看到生成此输出的代码.知道我会做错什么吗? public static void GetDisplayNames() { DISPLAY_DEVICE lpDisplayDevice = new(); l
24 2024-04-26
编程技术问答社区
在Azure Worker角色内使用kernel32 CreateThread/TerminateThread
我有需要使用的代码,但是让我回来的是在这里它说terminateThread 适用于:仅桌面应用仅. 我想知道我是否可以在Azure Worker角色中使用此代码,特别是在我用来运行Worker线程的过程中? [DllImport("Library.dll")] public static extern void InfiniteLoop(); [DllImport("kernel32")] private static extern int CreateThread( IntPtr lpThreadAttributes, UInt32 dwStackSize, IntPtr lpStartAddress, IntPtr param, UInt32 dwCreationFlags, UInt32 lpThreadId ); [DllImport("Kernel32.dll", CharSet = CharSet.Auto)] public
12 2024-04-25
编程技术问答社区
C++中Active Shape Models库的C#接口
stasm(http://www.milbo.users.sonic.sonic.net/stasm/index.html)是一个C ++库,用于在图像上查找功能,应用活动形状模型的概念. 我正在尝试使用这样在C#项目上.在C ++中,原型为 void AsmSearchDll( int *pnlandmarks, // out: number of landmarks, 0 if can't get landmarks int landmarks[], // out: the landmarks, caller must allocate const char image_name[], // in: used in internal error messages, if necessary const char image_data[], // in: image data, 3 bytes per pixel if is_color const int width, /
18 2024-04-25
编程技术问答社区
C#从C++ DLL中调用无符号的char*数组(输入和输出)。
我很难在C#应用程序和现有C ++ DLL之间编写数据.使这一困难的警告是它是一个无符号的炭指针,指向一个数组,我需要在C#中调用后(来自所有字段)访问数据.如果可能的话,我想避免使用不安全的代码. 这是C ++签名: BYTE GetData(unsigned char *Data_Type, unsigned char *Data_Content, unsigned int *Data_Length); 我尝试了C#中的一堆事情,但这是我现在拥有的: [DllImport("somecpp.dll")] public static extern byte GetData([In][Out] ref byte Data_Type, [In][Out] ref byte[] Data_Content, [In][Out] ref int Data_Length); 然后称呼它,我正在尝试: byte retrievedData = GetData(ref
12 2024-04-25
编程技术问答社区
在C#中调试DLLImport软件
我一直在试图获得 mysql在过去的12个小时左右的时间里,在我的C#申请中工作,并被卡住了一段时间.当我致电mysql_server_init() ... 时,我会遇到以下错误 毫无根据的例外:system.AcessviolationException:尝试阅读 或写受保护的内存. C ++方法将int和两个char**作为参数,但我被告知终止string[]数组在C#中就足够了.由于这是您应该致电的第一种方法,因此我对此问题有些不知所措. 这是我的代码... public class MySQLServer { [DllImport("libmysqld.dll")] static extern int mysql_server_init(int argc, string[] argv, string[] groups); [DllImport("libmysqld.dll")] static extern void my
10 2024-04-25
编程技术问答社区
不平衡的堆栈问题
zhanks在星期五对我在"重复控制台的C#问题"上收到的所有帮助.我发现我所有的问题都是由a引起的:" pinvokestackimbalance". 我在Win7 64位上使用C#Express 机器 我称之为32位C ++ dll的ftcjtag.dll.我有一个64位版本 可用的DLL. 可以通过我刚刚开始编码C#,到目前为止我用Google Google Google Google的所有内容都使我更加困惑,而不是帮助我.我希望您可以给我一个提示我的代码或建议做什么. 错误消息: pinvokestackimbalance wurde erkannt. 消息:呼叫PinVoke函数'WindowsFormsApplication1!WindowsFormsApplication1.form1 :: JTAG_GETHISPEEDDEVICENAMELOCIDCHANNEL'的堆栈不平衡.这可能是因为托管的PinVoke签名与非托管目标签名不符.检查PINVO
24 2024-04-25
编程技术问答社区
C#在DLLImport中的错误查找方法
我有一个使用dllimport导入的C ++组件. 我试图调用其方法: namespace Testing { class Test{ int Run(char* filePath, bool bEntry, double duration){//code} }; } [DllImport(dllName, CharSet = CharSet.Auto)] public static extern int Run(string filePath, bool bEntry, double duration) ); 当我调用其方法时,我会收到错误消息: 无法在DLL中找到名为Run的入口点 解决方案 "运行"看起来是一种非静态类方法.虽然,可以从C#调用此类方法,这不是主要用例.如果您通过COM暴露于.NET或以普通C界面的方式将其消费会更容易. extern "C" __declspec(dllexport)
18 2024-04-25
编程技术问答社区
未处理的异常。System.AccessViolationException: 试图读取或写入
下面是我的C ++ DLL // DLL.cpp : Defines the exported functions for the DLL application. #include "stdafx.h" //#include #include using namespace std; typedef void (*FunctionPtr)(int); void (*FunctionPtr1)(int); extern "C" __declspec(dllexport)void Caller(); extern "C" __declspec(dllexport)void RegisterFunction(FunctionPtr func_ptr); extern void Caller() { int i = 10; FunctionPtr1(i); }
20 2024-04-25
编程技术问答社区
如何正确地将C语言数组传递给C#?
我试图将一些数组从C ++传递到C#,并且它们被视为C数组. 使用C#中的回调接收这些数组. 这就是在C ++方面定义的方式: struct Image { unsigned char* image_ptr; int rows; int cols; }; typedef void(*CCallbackFn)(bool[], const char* [], Image[], Image, int length); 这就是我在C#中暴露它们的方式: [StructLayout(LayoutKind.Sequential)] struct ImageStruct { public IntPtr image_ptr; public int rows; public int cols; } delegate void CallbackDelegate( bool[] status, string[] id, ImageStruct[] im
10 2024-04-25
编程技术问答社区
c# DLLImport调用以char*为参数的c++方法
我使用Follwing方法获得了外部DLL(C ++): void _stdcall Set_Config(char* config) 我使用以下C#代码来调用该方法: [DllImport(DllName,CharSet=CharSet.Auto)] public static extern void Set_Config(String config); 但是,当我执行C#代码时,我会得到违规例外情况或system.runtime.interopservices.sehexception. (我的dll是32位,我的C#编译器编译为32位) 我还尝试用StringBuilder替换字符串配置,但结果相同. 有人可以帮助我解决这个问题或提供一些示例代码,我必须如何调用C ++方法? 解决方案 CharSet.Auto将编码为UTF-16.但是您的功能接受char*,因此文本被编码为8位文本,大概是ANSI. [DllImport(D
32 2024-04-25
编程技术问答社区
如何用C#共享Visual C++ DLL中的一个类?
我在C ++上编写了我的程序,并将其导出为DLL.我有一个C#WPF GUI,我想导入DLL进行处理. 我是C#的新手.如何在C#中使用C ++类?我知道我不能只使用.h文件. 因为我在c ++中使用了指针,所以我无法使用指针.这就是为什么我感到困惑.像在C ++中一样,我使用char*而不是string,我需要返回double*以获取大量double数据以及类似的数据. 解决方案 有多种方法: 如果它是com dll,则可以生成您可以使用C ++/CLI来构建创建.NET组件,该组件在本机上加载和调用方法. 要解决您的其他问题,是的,您可以在C#中使用指针.如果您具有具有double*参数的函数,则可以在C#中声明该函数: [DllImport("Your.DLL")] private static extern unsafe void DoProcessing(double* data, int dataSize); 您需要确保在C#项目的"
24 2024-04-24
编程技术问答社区
SendMessage的正确声明是什么,我如何转换我的代码以使用其参数?
我对各种声明sendmessage感到困惑.我怎么知道哪一个是正确的? 在我的C#Winforms应用程序(Windows 7)中,我使用以下; public class NativeMethods { [DllImport("user32.dll")] // Currently uses public static extern int SendMessage(IntPtr hWnd, uint wMsg, int wParam, int lParam); // Think I should probably be using // public static extern int SendMessage(IntPtr hWnd, uint wMsg, UIntPtr wParam, IntPtr lParam); } 但是调用sendmessage的代码为 NativeMethods.SendMessage(this
14 2024-04-24
编程技术问答社区
未处理的异常。System.AccessViolationException: 试图读取或写入
下面是我的C ++ DLL // DLL.cpp : Defines the exported functions for the DLL application. #include "stdafx.h" //#include #include using namespace std; typedef void (*FunctionPtr)(int); void (*FunctionPtr1)(int); extern "C" __declspec(dllexport)void Caller(); extern "C" __declspec(dllexport)void RegisterFunction(FunctionPtr func_ptr); extern void Caller() { int i = 10; FunctionPtr1(i); }
34 2024-04-24
编程技术问答社区