ZKX's LAB

C#中调用C++编译的DLL c 定义托管类dll的对象

2020-10-09知识9

C#调用C的DLL (Dpi_t*,DpiCil_t,DpiCda_t,DpiCdb_t*cdb,char*pic,int*picLen,int picCap,char*sig,int*sigLen,int sigCap);都是指针啊。C#也有指针。Intptr.然后你一定要知道结构体的字节大小,然后在C#里定义这样大小的结构体,然后用Intptr指针指向这个结构体,反正是比较麻烦的。以前我做的时候特别麻烦!因为麻烦所以很难写啊IntPtr P=Marshal.AllocHGlobal(4);Dpi_t*,把这些指针全部用IntPtr 替换。然后相等每个指针分配大小Marshal.AllocHGlobal(4)一定要与结构的大小,我这里是4位。Int是32位,大小为4.也就是说我这里Marshal.AllocHGlobal(4)可以看成是分配了一个Int的内存空间。不明白是很正常的。本来就是很难的东西。第一Dpi_t,DpiCil_t,DpiCda_t,DpiCdb_t 先找出这些结构体的定义。然后转换成相应在C#中的定义。这步做到了再能往下走HANDLE void*System.IntPtr 32 位void*dpiVoidCom 可能应该是个句柄。具体不清楚!没人手把手教你的话估计你很难弄出来。因为只要有一个地方大小不对就错了很多我都忘了。你自己一下啊!c#中的数据类型如何与API中的类型定义对应!Wtypes.h 中的非托管类型 非托管C 语言类型 托管类名 说明HANDLE void*System.IntPtr 32 位。

如何在C#中调用C/C++ DLL中的方法

C#中调用C++编译的DLL 如果是托管C++的话2113可以像1L说的一样直接引用,不过估计5261这样你就不会问了吧…4102…C#当中可以调用Native代码DLL中导出1653的函数,前提是你知道这个函数的名字。不要以为这个条件很简单,这意味着你必须把这个函数定义为extern\"C\"(也就是标准C的DLL导出,不要用VC+的C++导出格式,更不能直接导出类)。换句话来说,最起码的条件是,你把这个类的成员函数全部定义成普通的函数,也就是把int MyClass:MyMember(int paraA,int paraB);这样的函数写成extern\"C\"{int MyClass_MyMember(MyClass*pointThis,int paraA,int paraB);}这样的形式然后导出。当然,构造函数和析构函数也不例外,尤其析构函数非常重要,可能需要手工调用。这些只是最基本的条件。在C#当中调用Native库的函数,而且还用到指针,是一件非常危险的事情,极其容易造成内存泄露,最好三思而后行。

c#调用dll里的某个方法,该方法返回值类型是dll里定义的一个类,该如何强转 这是个很常见的同结构同名类跨域互转问题。假定A.Dll中有一个public ANameSpace.AppInfo SomeMethod()方法。如果AppInfo在A.Dll中定义,同名同结构的AppInfo类在B.Dll中也有定义,那么不管你是使用using A还是反射得到一个A中AppInfo类型的值,都不允许在B中使用(BNameSpace.AppInfo)SomeMethod()进行类型转换,即使我们知道两个AppInfo结构是完全一样的。取决于应用环境,一般会有以下几种处理方式。如果A.Dll允许被using。不存在上述问题,直接在B中使用A中定义的AppInfo。如果A.Dll不允许被using,但允许被有限度的修改。常见的解决方法,让AppInfo实现接口、或者将A中AppInfo更改为框架内置的数据类型比如List等、让A中AppInfo支持序列化/反序列化(XmlSerialization最佳/BinarySerialization亦可)都可以满足大部分需要,同时尽可能避免B的更改。如果A.Dll不允许被using,也不允许被修改。必须通过反射实现类型转换。标准做法是在B中自写TypeConverter以提供object向B中AppInfo转换的功能(当然这里的object的实际类型是A中的AppInfo)。该类型转换器应能够通过反射获取必要的值并填充至新AppInfo对象的对应字段。以上操作本质上就是对象的浅表克隆。当然,偷懒的。

C#调用C语言编写的DLL会不会产生什么问题? 首先,C#是可以调用C写的DLL的,引用时VS会自动将这个DLL转换为托管程序。但是你这个DLL是去调用别的C库就会出问题,因为别的库依然是非托管的。

使用,对净DLL在非托管C问题,怎么解决 DWORD GetShortPathName(LPCTSTR tpszLongPath,TPTSTR lpszShortPath,DWORD cchBuffer);非托管及托管数据类型对应关系:LPCTSTR StringLPTSTR StringBuilderDWORD intDllImport的导入规则:1、方法名与Win API完全一样。如果在C#中调用时显示完全不同的方法名称,则需要引入EntryPoint属性,使用别名显示。2、函数除需要DllImport类修饰符外,还需要声明public static extern类型。3、函数返回值和参数必须和调用的API的完全一样。4、必须引入System.Runtime.InteropServices命名空间。代码:

如何在一个托管的C++工程中,调用一个基于MFC的DLL???急求 我想,你应该已经在网上查到大概的用法了吧,比如:[DllImport(“hello.dll”)]private extern static int DeviceOpen(int aDevType,int aDevIndex,ref IntPtr aHandle);用于调用hello.dll里的DeviceOpen函数。但是这个时候可能会出现一些莫名其妙的问题,常见的有如下两个:1.函数名。C++编译器对函数名的处理与C不同,会加上一些字符用于标识函数的参数信息,比如上述的DeviceOpen函数的实际名称,可能就是:DeviceOpen@YAHHHPAPAX@Z这个可以用十六进制编辑器在你的Dll里面查找然后验证一下,一般都是前面后面加上一点字符而已。然后使用时就这样:[DllImport(DLL_FILE,EntryPoint=?DeviceOpen@YAHHHPAPAX@Z\")]private extern static int DeviceOpen(int aDevType,int aDevIndex,ref IntPtr aHandle);2.调用协定。对于CLR来说普通的WindowsAPI,调用协定是默认值,也就是stdcall。但是C++编译出来的函数,默认值一般是cdecl。所以想正确调用自己编写的Dll内的函数,还要指定调用协议。如:[DllImport(DLL_FILE,CallingConvention=CallingConvention.Cdecl,EntryPoint=?DeviceOpen@YAHHHPAPAX@Z\")]private extern static int DeviceOpen(int aDevType,int aDevIndex。

怎么通俗的解释COM组件?

调用DLL命令后发现堆栈错误怎么办 现在是更深入地进行探讨的时候了。在对托管代码进行 P/INVOKE 调用时,DLLIMPORTATTRIBUTE 类型扮演着重要的角色。DLLIMPORTATTRIBUTE 的。

怎样在C#中引入C++编译的DLL文件的类定义

#dll文件#int函数#extern#函数调用#堆栈

随机阅读

qrcode
访问手机版