豪仕知识网--知识就是力量!

微信
手机版
生活常识

VisualStudio中.Net引用C++的DLL报错解决方案|vs怎么引用dll

作者 :钱途无量 2024-01-07 10:56:56 围观 : 评论

VisualStudio中.Net引用C++的DLL报错解决方案|vs怎么引用dll

豪士君测试所用平台

VisualStudio中.Net引用C++的DLL报错解决方案,一起来看看吧,希望能帮助到您,更多请关注豪仕知识网。

.Net 开发中如果使用外部DLL,一般引用进来就可以了,最多引用前将DLL注册一下。下面是我所遇到的问题及解决的方法,希望能对大家有用。

●☛█▼▲豪仕知识网◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲

1.在Visual Studio中引用C++写的DLL时报以下错误

未能添加引用,请确保此文件可访问并且是一个有效的程序集或COM组件。

手工注册该DLL也报错:模块已加载,但找不到入口点DLLRegisterServer, 请确保XXX为有效的DLL或OCA文件,然后重试。

◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲HTTP://WWW.hAoz.net███████████████████████████东方金报网

经查询发现C++编译的DLL并不一定能被C#直接使用,需通过C#中的DllImport直接调用这些功能。

代码如下所示:

在程序开始时使用以下语句注册方法。

HTTP://WWW.haoz.net◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐豪仕知识网

[DllImport("Enc7481.dll", EntryPoint = "_Enc7481_Set_Encoder", ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]private extern static void _Enc7481_Set_Encoder(UInt16 intDirection, Int32 lngValue);

在程序中直接调用就可以了:

HTTP://WWW.haoz.net豪仕知识网采集不好玩哦◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐撒旦法师打发斯蒂芬

_Enc7481_Set_Encoder(0, 0);

◐◐◐◐●☛█▼▲豪仕知识网http://www.haOz.net▼▲▼▲▼▲▼▲▼●●●●●●●▼▲▼▲▼▲

2.找不到对应的方法

使用以上的程序后,参考厂商所给的C++程序却报找不到对应的入口点,也就是函数名称不对。C++DLL编译后函数名称会有变化,需使用eXeScope.exe查询具体的函数名称。

◐◐◐◐●☛█▼▲豪仕知识网███████http://www.haOZ.net▼▲▼▲▼▲▼▲▼●●●●●●●▼▲▼▲▼▲

3.报内存错误:

尝试读取或写入受保护的内存。这通常指示其他内存已损坏。造成这种错误的情况很多,一般来说是对函数的使用错误造成的。对于我的程序来说是因为需要首先调用_Enc7481_Init()来初始化。

◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲HTTP://WWW.hAoz.net███████████████████████████东方金报网

4.类型错误

◐◐◐◐●☛█▼▲豪仕知识网███████http://www.haOZ.net▼▲▼▲▼▲▼▲▼●●●●●●●▼▲▼▲▼▲

终于将以上错误都解决,程序可以运行了,但发现取到的数据总是不对,再次检查,发现原来是数据类型不对造成的。

◐◐◐◐●☛█▼▲豪仕知识网███████豪仕知识http://www.Haoz.net▼▲▼▲▼▲▼▲▼●●●●●●●▼▲▼▲▼▲

VC++中主要字符串类型为:LPSTR,LPCSTR, LPCTSTR, string, CString, LPCWSTR, LPWSTR等但转为C#类型却不完全相同,只有数据类型对应正确才能取得正确的数据。

◐◐◐◐●☛█▼▲豪仕知识网http://www.haOz.net▼▲▼▲▼▲▼▲▼●●●●●●●▼▲▼▲▼▲

类型对照:

BSTR --------- StringBuilder

●☛█▼▲豪仕知识网◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲

LPCTSTR --------- StringBuilder

◐◐◐◐●☛█▼▲豪仕知识网HT●☛█▼▲◐◐◐◐●☛█▼▲

LPCWSTR --------- IntPtr

HTTP://WWW.haoz.net◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐豪仕知识网

handle---------IntPtr

◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲豪仕知识网HtTp://▲▼▲▼▲

hwnd-----------IntPtr

char *----------string

int * -----------ref int

◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲豪仕知识网HtTp://▲▼▲▼▲

int &-----------ref int

void *----------IntPtr

◐◐◐◐●☛█▼▲豪仕知识网http://www.haOz.net▼▲▼▲▼▲▼▲▼●●●●●●●▼▲▼▲▼▲

unsigned char *-----ref byte

5.结构体参数的传递

对于结构体参数需要在C#中建立对应的结构体,并用Marshal类将结构体转换为指针地址传给C++函数,取得数据后再根据指针地址取得对应的结构。

◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲豪仕知识网HtTp://▲▼▲▼▲

HREE structThree = new THREE(); IntPtr ptrThree = Marshal.AllocHGlobal(Marshal.SizeOf(structThree)); Marshal.StructureToPtr(structThree, ptrThree, false); _Enc7481_Get_ThreeEncoder2(ptrThree); structThree = (THREE)Marshal.PtrToStructure(ptrThree, typeof(THREE));

.Net 开发中如果使用外部DLL,一般引用进来就可以了,最多引用前将DLL注册一下。下面是我所遇到的问题及解决的方法,希望能对大家有用。

◐◐◐◐●☛█▼▲豪仕知识网HT●☛█▼▲◐◐◐◐●☛█▼▲

1.在Visual Studio中引用C++写的DLL时报以下错误

未能添加引用,请确保此文件可访问并且是一个有效的程序集或COM组件。

手工注册该DLL也报错:模块已加载,但找不到入口点DLLRegisterServer, 请确保XXX为有效的DLL或OCA文件,然后重试。

◐◐◐◐●☛█▼▲豪仕知识网███████豪仕知识http://www.Haoz.net▼▲▼▲▼▲▼▲▼●●●●●●●▼▲▼▲▼▲

经查询发现C++编译的DLL并不一定能被C#直接使用,需通过C#中的DllImport直接调用这些功能。

◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲HtTp://wWW.haoz.net豪仕知识网●●●●●●●●●●●●●●●●●●●●●●●●●●

代码如下所示:

◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲豪仕知识网HtTp://▲▼▲▼▲

在程序开始时使用以下语句注册方法。

◐◐◐◐●☛█▼▲豪仕知识网███████http://www.haOZ.net▼▲▼▲▼▲▼▲▼●●●●●●●▼▲▼▲▼▲

[DllImport("Enc7481.dll", EntryPoint = "_Enc7481_Set_Encoder", ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]private extern static void _Enc7481_Set_Encoder(UInt16 intDirection, Int32 lngValue);

◐◐◐◐●☛█▼▲豪仕知识网HT●☛█▼▲◐◐◐◐●☛█▼▲

在程序中直接调用就可以了:

_Enc7481_Set_Encoder(0, 0);

2.找不到对应的方法

◐◐◐◐●☛█▼▲豪仕知识网███████http://www.haOZ.net▼▲▼▲▼▲▼▲▼●●●●●●●▼▲▼▲▼▲

使用以上的程序后,参考厂商所给的C++程序却报找不到对应的入口点,也就是函数名称不对。C++DLL编译后函数名称会有变化,需使用eXeScope.exe查询具体的函数名称。

3.报内存错误:

尝试读取或写入受保护的内存。这通常指示其他内存已损坏。造成这种错误的情况很多,一般来说是对函数的使用错误造成的。对于我的程序来说是因为需要首先调用_Enc7481_Init()来初始化。

HTTP://WWW.haoz.net豪仕知识网采集不好玩哦◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐撒旦法师打发斯蒂芬

4.类型错误

终于将以上错误都解决,程序可以运行了,但发现取到的数据总是不对,再次检查,发现原来是数据类型不对造成的。

◐◐◐◐●☛█▼▲豪仕知识网███████豪仕知识http://www.Haoz.net▼▲▼▲▼▲▼▲▼●●●●●●●▼▲▼▲▼▲

VC++中主要字符串类型为:LPSTR,LPCSTR, LPCTSTR, string, CString, LPCWSTR, LPWSTR等但转为C#类型却不完全相同,只有数据类型对应正确才能取得正确的数据。

类型对照:

BSTR --------- StringBuilder

HTTP://WWW.haoz.net豪仕知识网采集不好玩哦◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐撒旦法师打发斯蒂芬

LPCTSTR --------- StringBuilder

LPCWSTR --------- IntPtr

◐◐◐◐●☛█▼▲豪仕知识网HT●☛█▼▲◐◐◐◐●☛█▼▲

handle---------IntPtr

hwnd-----------IntPtr

char *----------string

●☛█▼▲豪仕知识网◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲

int * -----------ref int

int &-----------ref int

void *----------IntPtr

HTTP://WWW.haoz.net◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐豪仕知识网

unsigned char *-----ref byte

5.结构体参数的传递

对于结构体参数需要在C#中建立对应的结构体,并用Marshal类将结构体转换为指针地址传给C++函数,取得数据后再根据指针地址取得对应的结构。

http://www.haoz.net●☛█▼▲◐●☛█▼▲◐◐◐◐●☛█▼▲◐豪仕知识网●☛█▼▲豪仕知识网

HREE structThree = new THREE(); IntPtr ptrThree = Marshal.AllocHGlobal(Marshal.SizeOf(structThree)); Marshal.StructureToPtr(structThree, ptrThree, false); _Enc7481_Get_ThreeEncoder2(ptrThree); structThree = (THREE)Marshal.PtrToStructure(ptrThree, typeof(THREE));

以上就是VisualStudio中.Net引用C++的DLL报错解决方案的相关内容分享,字数约6189字,希望这对大家有所帮助!豪仕知识网往后会继续推荐VisualStudio中.Net引用C++的DLL报错解决方案相关内容。

豪仕知识网http://www.haoz.net▼▲▼▲▼▲▼▲▼●●●●●●●▼▲▼▲▼▲

相关文章