vc怎么调用vb.net编写的DLL?急

时间:2021-07-07 14:01:54
我用vs2003,我现在需要用 vc调用vb.net编写的DLL(不是ocx),看了网上一些方法没成功。有人知道怎么做吗?

18 个解决方案

#1


该回复于2016-03-11 08:58:12被管理员删除

#2


自顶,如题。。。。。

#3


使用C++/CLI 引用vb.net的dll 就可以直接调用了 

#4


不要做A语言代码修改为B语言代码的无用功。
也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。
只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。
即可很方便地让A、B两种语言之间协调工作。
比如:
A将请求数据写到文件a.txt,写完后改名为aa.txt
B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,改名为bb.txt
A发现bb.txt存在时,读取其内容,读完后删除bb.txt
以上A可以替换为任何一种开发语言或开发环境,B可以替换为任何一种与A不同的开发语言或开发环境。
除非A或B不支持判断文件是否存在、文件读写和文件更名。
但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢?
可以将临时文件放在RamDisk上提高效率减少磨损磁盘。
数据的结构很复杂的话,文本文件的格式问题可参考json或xml

共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多,下面仅列出我现在能想到的:
·进程之间松耦合
·进程可在同一台机器上,也可跨机,跨操作系统,跨硬件平台,甚至跨国。
·方便调试和监视,只需让第三方或人工查看该临时文本文件即可。
·方便在线开关服务,只需删除或创建该临时文本文件即可。
·方便实现分布式和负载均衡。
·方便队列化提供服务,而且几乎不可能发生队列满的情况(除非硬盘空间满)
·……

“跨语言、跨机,跨操作系统,跨硬件平台,跨国,跨*.*的” 苦海无边,
回头是“使用共享纯文本文件进行信息交流”的 岸!

#5


@akirya 后来查到这个方法。但是遇到其他问题 vc怎么调用vb.net编写的DLL?急
(就算是VB调用也是一样)
后来我注册了dll文件,用regasm,虽然成功注册,但是注册项并没有clsid。更找不到这个错误说的clsid。

#6


楼主可以考虑将毕生献给”证明用A语言代码直接调用B语言代码库不复杂、不容易出错“革命事业。 vc怎么调用vb.net编写的DLL?急

#7


引用 5 楼 qq_27385509 的回复:
@akirya 后来查到这个方法。但是遇到其他问题 vc怎么调用vb.net编写的DLL?急
(就算是VB调用也是一样)
后来我注册了dll文件,用regasm,虽然成功注册,但是注册项并没有clsid。更找不到这个错误说的clsid。

是不是这个dll有问题

#8


@zhao4zhong1 感谢赵4老师提醒。我也不想做,但这是要求我不得不去完成。
@xianglitian @akirya 今天查到下面这个贴子和我情况基本一样。(http://bbs.csdn.net/topics/60196362)加上我不会VB,所以我怀疑我VB代码就写错了。我把一些东西贴出来你们看看。

vc怎么调用vb.net编写的DLL?急
“DefaultDomain”: 已加载“c:\windows\microsoft.net\framework\v1.1.4322\mscorlib.dll”,未加载符号。
“VBApplication1”: 已加载“c:\windows\assembly\gac\mscorlib.resources\1.0.5000.0_zh-chs_b77a5c561934e089\mscorlib.resources.dll”,未加载符号。
“VBApplication1”: 已加载“D:\用户目录\我的文档\Visual Studio Projects\VBApplication1\VBApplication1\bin\VBApplication1.exe”,符号已加载。
“VBApplication1.exe”: 已加载“c:\windows\assembly\gac\system.windows.forms\1.0.5000.0__b77a5c561934e089\system.windows.forms.dll”,未加载符号。
“VBApplication1.exe”: 已加载“c:\windows\assembly\gac\system\1.0.5000.0__b77a5c561934e089\system.dll”,未加载符号。
“VBApplication1.exe”: 已加载“c:\windows\assembly\gac\system.drawing\1.0.5000.0__b03f5f7f11d50a3a\system.drawing.dll”,未加载符号。
“VBApplication1.exe”: 已加载“d:\用户目录\我的文档\visual studio projects\vbapplication1\vbapplication1\bin\dhcinsubll.dll”,符号已加载。
“VBApplication1.exe”: 已加载“c:\windows\assembly\gac\microsoft.visualbasic\7.0.5000.0__b03f5f7f11d50a3a\microsoft.visualbasic.dll”,未加载符号。
“VBApplication1.exe”: 已加载“d:\用户目录\我的文档\visual studio projects\vbapplication1\vbapplication1\bin\dhcinsumodel.dll”,符号已加载。
“VBApplication1.exe”: 已加载“d:\用户目录\我的文档\visual studio projects\vbapplication1\vbapplication1\bin\applociationframework.dll”,符号已加载。
“VBApplication1.exe”: 已加载“d:\用户目录\我的文档\visual studio projects\vbapplication1\vbapplication1\bin\dhcinsuadaper.dll”,符号已加载。
“VBApplication1.exe”: 已加载“d:\用户目录\我的文档\visual studio projects\vbapplication1\vbapplication1\bin\dhcinsudalcache.dll”,符号已加载。
“VBApplication1.exe”: 已加载“d:\用户目录\我的文档\visual studio projects\vbapplication1\vbapplication1\bin\interop.medicarecomlib.dll”,未加载符号。
未处理的“System.Runtime.InteropServices.COMException”类型的异常出现在 dhcinsuadaper.dll 中。
其他信息: 带有 CLSID {6ED3D8A4-FD47-4ED8-A93F-96EB87B5D830} 的 COM 对象无效或未注册。
程序“[12116] VBApplication1.exe”已退出,返回值为 0 (0x0)。

#9


上图李小明那句报错
vc怎么调用vb.net编写的DLL?急
vc怎么调用vb.net编写的DLL?急

#10


提醒:
在64位Windows下:
64位exe和dll在目录c:\windows\sys tem32目录下;
32位exe和dll在目录c:\windows\sys wow64目录下;
所以要注意:
    在win64位系统下注册32位ocx或dll需要将32位ocx或dll拷贝到c:\windows\syswow64\目录下。
    且注册要用c:\windows\syswow64\regsvr32 xxxxxxx.ocx或dll

#11


用depends.exe查看dll依赖的其它dll

#12


带有 CLSID {6ED3D8A4-FD47-4ED8-A93F-96EB87B5D830} 的 COM 对象无效或未注册。
这个不是很明显的报错么

#13


@akirya 怎么解决,你是说没注册吗,但是我手动注册了dll文件,用regasm,虽然成功注册,但是注册项并没有clsid。注册表还是搜索不到这个clsid。

#14


谢谢各位了,今天发现只是缺少环境,上面问题只是表面。
@akirya 请教您一个问题,非托管代码(c++) 怎么释放 托管代码(VB.net dll)类创建的对象。我使用delete产生 error C3841: 非法删除表达式 : 托管类型“xx::xxx”没有定义的析构函数。
之前您说过CLI,(我的是VS2003没有CLI,不过可以选c++.net项目和勾选 托管,当然这不是重点)。托管代码和非托管代码不一样,我想请教下,怎么去new delete托管类的对象,或者不用释放

#15


引用 14 楼 qq_27385509 的回复:
谢谢各位了,今天发现只是缺少环境,上面问题只是表面。
@akirya 请教您一个问题,非托管代码(c++) 怎么释放 托管代码(VB.net dll)类创建的对象。我使用delete产生 error C3841: 非法删除表达式 : 托管类型“xx::xxx”没有定义的析构函数。
之前您说过CLI,(我的是VS2003没有CLI,不过可以选c++.net项目和勾选 托管,当然这不是重点)。托管代码和非托管代码不一样,我想请教下,怎么去new delete托管类的对象,或者不用释放


不引用托管对象就可以了,会自动释放的。

#16


@珍惜生命远离CPP   可以我需要用到这个 托管代码(vb.net)写的dll 的函数, 怎么不引用托管对象呢?
添加引用这个dll文件。然后我用c++ 直接using namespace dll,然后 obj =new 这个dll的类。 obj用完需要手动释放吗?

#17



引用 16 楼 qq_27385509 的回复:
@珍惜生命远离CPP   可以我需要用到这个 托管代码(vb.net)写的dll 的函数, 怎么不引用托管对象呢?
添加引用这个dll文件。然后我用c++ 直接using namespace dll,然后 obj =new 这个dll的类。 obj用完需要手动释放吗?

obj = nullptr;就行了

#18


@akirya 谢谢,就是用完obj = nullptr就是了。
还想请教你一个,因为nullptr需要C++11支持,但我用VS2003。想问用NULL可以吗?还是有其他方法?

#1


该回复于2016-03-11 08:58:12被管理员删除

#2


自顶,如题。。。。。

#3


使用C++/CLI 引用vb.net的dll 就可以直接调用了 

#4


不要做A语言代码修改为B语言代码的无用功。
也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。
只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。
即可很方便地让A、B两种语言之间协调工作。
比如:
A将请求数据写到文件a.txt,写完后改名为aa.txt
B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,改名为bb.txt
A发现bb.txt存在时,读取其内容,读完后删除bb.txt
以上A可以替换为任何一种开发语言或开发环境,B可以替换为任何一种与A不同的开发语言或开发环境。
除非A或B不支持判断文件是否存在、文件读写和文件更名。
但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢?
可以将临时文件放在RamDisk上提高效率减少磨损磁盘。
数据的结构很复杂的话,文本文件的格式问题可参考json或xml

共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多,下面仅列出我现在能想到的:
·进程之间松耦合
·进程可在同一台机器上,也可跨机,跨操作系统,跨硬件平台,甚至跨国。
·方便调试和监视,只需让第三方或人工查看该临时文本文件即可。
·方便在线开关服务,只需删除或创建该临时文本文件即可。
·方便实现分布式和负载均衡。
·方便队列化提供服务,而且几乎不可能发生队列满的情况(除非硬盘空间满)
·……

“跨语言、跨机,跨操作系统,跨硬件平台,跨国,跨*.*的” 苦海无边,
回头是“使用共享纯文本文件进行信息交流”的 岸!

#5


@akirya 后来查到这个方法。但是遇到其他问题 vc怎么调用vb.net编写的DLL?急
(就算是VB调用也是一样)
后来我注册了dll文件,用regasm,虽然成功注册,但是注册项并没有clsid。更找不到这个错误说的clsid。

#6


楼主可以考虑将毕生献给”证明用A语言代码直接调用B语言代码库不复杂、不容易出错“革命事业。 vc怎么调用vb.net编写的DLL?急

#7


引用 5 楼 qq_27385509 的回复:
@akirya 后来查到这个方法。但是遇到其他问题 vc怎么调用vb.net编写的DLL?急
(就算是VB调用也是一样)
后来我注册了dll文件,用regasm,虽然成功注册,但是注册项并没有clsid。更找不到这个错误说的clsid。

是不是这个dll有问题

#8


@zhao4zhong1 感谢赵4老师提醒。我也不想做,但这是要求我不得不去完成。
@xianglitian @akirya 今天查到下面这个贴子和我情况基本一样。(http://bbs.csdn.net/topics/60196362)加上我不会VB,所以我怀疑我VB代码就写错了。我把一些东西贴出来你们看看。

vc怎么调用vb.net编写的DLL?急
“DefaultDomain”: 已加载“c:\windows\microsoft.net\framework\v1.1.4322\mscorlib.dll”,未加载符号。
“VBApplication1”: 已加载“c:\windows\assembly\gac\mscorlib.resources\1.0.5000.0_zh-chs_b77a5c561934e089\mscorlib.resources.dll”,未加载符号。
“VBApplication1”: 已加载“D:\用户目录\我的文档\Visual Studio Projects\VBApplication1\VBApplication1\bin\VBApplication1.exe”,符号已加载。
“VBApplication1.exe”: 已加载“c:\windows\assembly\gac\system.windows.forms\1.0.5000.0__b77a5c561934e089\system.windows.forms.dll”,未加载符号。
“VBApplication1.exe”: 已加载“c:\windows\assembly\gac\system\1.0.5000.0__b77a5c561934e089\system.dll”,未加载符号。
“VBApplication1.exe”: 已加载“c:\windows\assembly\gac\system.drawing\1.0.5000.0__b03f5f7f11d50a3a\system.drawing.dll”,未加载符号。
“VBApplication1.exe”: 已加载“d:\用户目录\我的文档\visual studio projects\vbapplication1\vbapplication1\bin\dhcinsubll.dll”,符号已加载。
“VBApplication1.exe”: 已加载“c:\windows\assembly\gac\microsoft.visualbasic\7.0.5000.0__b03f5f7f11d50a3a\microsoft.visualbasic.dll”,未加载符号。
“VBApplication1.exe”: 已加载“d:\用户目录\我的文档\visual studio projects\vbapplication1\vbapplication1\bin\dhcinsumodel.dll”,符号已加载。
“VBApplication1.exe”: 已加载“d:\用户目录\我的文档\visual studio projects\vbapplication1\vbapplication1\bin\applociationframework.dll”,符号已加载。
“VBApplication1.exe”: 已加载“d:\用户目录\我的文档\visual studio projects\vbapplication1\vbapplication1\bin\dhcinsuadaper.dll”,符号已加载。
“VBApplication1.exe”: 已加载“d:\用户目录\我的文档\visual studio projects\vbapplication1\vbapplication1\bin\dhcinsudalcache.dll”,符号已加载。
“VBApplication1.exe”: 已加载“d:\用户目录\我的文档\visual studio projects\vbapplication1\vbapplication1\bin\interop.medicarecomlib.dll”,未加载符号。
未处理的“System.Runtime.InteropServices.COMException”类型的异常出现在 dhcinsuadaper.dll 中。
其他信息: 带有 CLSID {6ED3D8A4-FD47-4ED8-A93F-96EB87B5D830} 的 COM 对象无效或未注册。
程序“[12116] VBApplication1.exe”已退出,返回值为 0 (0x0)。

#9


上图李小明那句报错
vc怎么调用vb.net编写的DLL?急
vc怎么调用vb.net编写的DLL?急

#10


提醒:
在64位Windows下:
64位exe和dll在目录c:\windows\sys tem32目录下;
32位exe和dll在目录c:\windows\sys wow64目录下;
所以要注意:
    在win64位系统下注册32位ocx或dll需要将32位ocx或dll拷贝到c:\windows\syswow64\目录下。
    且注册要用c:\windows\syswow64\regsvr32 xxxxxxx.ocx或dll

#11


用depends.exe查看dll依赖的其它dll

#12


带有 CLSID {6ED3D8A4-FD47-4ED8-A93F-96EB87B5D830} 的 COM 对象无效或未注册。
这个不是很明显的报错么

#13


@akirya 怎么解决,你是说没注册吗,但是我手动注册了dll文件,用regasm,虽然成功注册,但是注册项并没有clsid。注册表还是搜索不到这个clsid。

#14


谢谢各位了,今天发现只是缺少环境,上面问题只是表面。
@akirya 请教您一个问题,非托管代码(c++) 怎么释放 托管代码(VB.net dll)类创建的对象。我使用delete产生 error C3841: 非法删除表达式 : 托管类型“xx::xxx”没有定义的析构函数。
之前您说过CLI,(我的是VS2003没有CLI,不过可以选c++.net项目和勾选 托管,当然这不是重点)。托管代码和非托管代码不一样,我想请教下,怎么去new delete托管类的对象,或者不用释放

#15


引用 14 楼 qq_27385509 的回复:
谢谢各位了,今天发现只是缺少环境,上面问题只是表面。
@akirya 请教您一个问题,非托管代码(c++) 怎么释放 托管代码(VB.net dll)类创建的对象。我使用delete产生 error C3841: 非法删除表达式 : 托管类型“xx::xxx”没有定义的析构函数。
之前您说过CLI,(我的是VS2003没有CLI,不过可以选c++.net项目和勾选 托管,当然这不是重点)。托管代码和非托管代码不一样,我想请教下,怎么去new delete托管类的对象,或者不用释放


不引用托管对象就可以了,会自动释放的。

#16


@珍惜生命远离CPP   可以我需要用到这个 托管代码(vb.net)写的dll 的函数, 怎么不引用托管对象呢?
添加引用这个dll文件。然后我用c++ 直接using namespace dll,然后 obj =new 这个dll的类。 obj用完需要手动释放吗?

#17



引用 16 楼 qq_27385509 的回复:
@珍惜生命远离CPP   可以我需要用到这个 托管代码(vb.net)写的dll 的函数, 怎么不引用托管对象呢?
添加引用这个dll文件。然后我用c++ 直接using namespace dll,然后 obj =new 这个dll的类。 obj用完需要手动释放吗?

obj = nullptr;就行了

#18


@akirya 谢谢,就是用完obj = nullptr就是了。
还想请教你一个,因为nullptr需要C++11支持,但我用VS2003。想问用NULL可以吗?还是有其他方法?