vb动态调用DLL的问题

问题描述

一个连接接口DLL,正常调用时先注册DLL文件,vb中引入,创建对象都没问题;DimobjCommAsHsCommX.Comm'定义对象objComm=CreateObject("HsCommX.Comm")objComm.Create()'创建对象…………但这种方式在多线程调用的情况下性能就会急剧下降。目前是想改成动态调用的方式,在不同的目录下放置多个DLL,但在VB.net里实在不知道怎么实现常使用反射,DimAssDLLAsAssemblyAssDLL=System.Reflection.Assembly.LoadFile("C:WINDOWSsystem32HsCommX.dll")'载入程序集到AssDLL中.DimDLLTypeAsType=AssDLL.GetType("HsCommX.Comm")'获取Free命名空间中的类MainFunction的类型.DimNewObjAsObject=Activator.CreateInstance(DLLType)'实例TypeDLLType获取到的类型的对像DimmAsMethodInfo=DLLType.GetMethod("Connect")'从DLLType获取AttachCode这个方法m.Invoke(NewObj,Nothing)Assembly.LoadFile直接异常,报“该模块应包含一个程序集清单”,实在是不明白~就算把HsCommX.dll所有引用的DLL放到同一个C:1的目录下,Load或者LoadFile("C:1HsCommX.dll")也报这个异常。没怎么用过COM组件,不明白。还有C里常见的LoadLibrary这类写法,在vb.net不知道怎么实现DimlbAsLong,paAsLonglb=LoadLibrary("C:WINDOWSsystem32HsCommX.dll")pa=GetProcAddress(lb,"DllGetClassObject")FreeLibrary(lb)

解决方案

解决方案二:
一、比如我事先写了一个类,如下:

PublicClassTestClassPublicFunctionAdd(ByValadd1AsInteger,ByValadd2AsInteger)AsIntegerReturnadd1+add2EndFunctionEndClass

然后编译成了ClassDll.dll文件.二、在另一个程序中,我写入了如下代码

PublicFunctionAdd(ByValadd1AsInteger,ByValadd2AsInteger)AsIntegerDimasmAsSystem.Reflection.Assembly=System.Reflection.Assembly.LoadFile("ClassDll.dll")DimclasstempAsType=asm.GetType("ClassDll.dll.TestClass")DimobjAsObject=asm.CreateInstance(classtemp.FullName)Dimme_InfoAsSystem.Reflection.MethodInfo=classtemp.GetMethod("Add")Dimparamter(1)AsObjectparamter(0)=add1paramter(1)=add2Returnme_Info.Invoke(obj,paramter)EndFunction

执行上面的Add函数其功能和执行一中的Add函数是一样的。上面的System.Reflection.Assembly.LoadFile("ClassDll.dll")这一句里的ClassDll.dll是我们编译的那个dll文件。如果其不是放在程序目录下,这里必须换成ClassDll.dll的绝对路径。即就是你dll文件的绝对路径
解决方案三:
1F正解。
解决方案四:
引用1楼zenggang999的回复:

一、比如我事先写了一个类,如下:

PublicClassTestClassPublicFunctionAdd(ByValadd1AsInteger,ByValadd2AsInteger)AsIntegerReturnadd1+add2EndFunctionEndCla……

学习下

时间: 2024-07-29 12:21:36

vb动态调用DLL的问题的相关文章

C#程序实现动态调用DLL的研究

原文:C#程序实现动态调用DLL的研究 C#程序实现动态调用DLL的研究 摘  要:在<csdn开发高手>2004年第03期中的<化功大法--将DLL嵌入EXE>一文,介绍了如何把一个动态链接库作为一个资源嵌入到可执行文件,在可执行文件运行时,自动从资源中释放出来,通过静态加载延迟实现DLL函数的动态加载,程序退出后实现临时文件的自动删除,从而为解决"DLL Hell"提供了一种解决方案.这是一个很好的设计思想,而且该作者也用C++实现了,在Internet上也

动态电用dll出错-动态调用Dll出错,服务模式

问题描述 动态调用Dll出错,服务模式 用MFC开发一个服务程序,服务程序在应用模式下,动态调用dll正常,然而变成服务模式,会导致服务停止.请问这是怎么回事,请大神指点. 解决方案 主要是你服务运行情况下,进程权限会变高,同时不能直接访问一些用户目录等.服务运行在SESSION0,这个可能会导致你的DLL处理有问题.你需要检查一下DLL的内部代码逻辑 解决方案二: http://www.cnblogs.com/duanshuiliu/archive/2012/07/05/2577402.htm

求助:C#动态调用DLL的,为什么getProcAddress无法获得NATIVE DLL中的导出函数?

问题描述 ①自己用C++写了个DLL在其中声明了一个导出函数extern"C"__declspec(dllexport)LRESULTCALLBACKhookProc(intnCode,WPARAMwParam,LPARAMlParam){//实现内容忽略return1;} 生成DLL后,因为是C++编译器编译的,会改变方法名,于是我用了VIEWDLL查看了导出函数名称叫_hookProc@12②调用DLL代码[DllImport("kernel32.dll",Ch

VB动态调用自己的ActiveX DLL

active|activex|动态 这几天在琢磨自己编写一个MS-OFFICE基础操作的阅卷系统,当然类似的系统已经有不少了:国家计算机等级一级辅助学习系统.各地方的计算机职称考试系统.各高校的计算机文化基础辅助学习系统以及一些商业的及个人的类似的系统.那么我的阅卷系统要有什么特点呢?     这类系统.无非就是调用MS的OFFICE类库,然后使用其提供的各种对象来判断操作者的对错.开发工具首选VB6.0,开发效率高,最重要的就是其和VBA本身就是一家.系统框架采用主程序(exe)加Active

.NET动态调用DLL的方法

很多软件都是可插拔的,最知名的便是微软的Windows操作系统.你可以在Windows操作系统上安装QQ,也可卸掉QQ,这便是可插拔.这里不谈Windows的实现,因为太过复杂.本文就谈谈管理软件的可插拔的实现.相对Windows操作系统,QQ就是它的一个插件.所以可以简单的将开发可插拔的软件分为两个部分.一个是主应用程序的开发,一个是插件的开发. 比Windows小的,常见的可插拔的软件是MSN.MSN主应用程序由MS开发,还存在一些MSN插件开发商,国内好像也有不少,这些插件开发商通过在插件

一起谈.NET技术,.NET动态调用DLL的方法

很多软件都是可插拔的,最知名的便是微软的Windows操作系统.你可以在Windows操作系统上安装QQ,也可卸掉QQ,这便是可插拔.这里不谈Windows的实现,因为太过复杂.本文就谈谈管理软件的可插拔的实现.相对Windows操作系统,QQ就是它的一个插件.所以可以简单的将开发可插拔的软件分为两个部分.一个是主应用程序的开发,一个是插件的开发. 比Windows小的,常见的可插拔的软件是MSN.MSN主应用程序由MS开发,还存在一些MSN插件开发商,国内好像也有不少,这些插件开发商通过在插件

C++中如何动态调用dll杀进程

代码如下: #include <stdio.h> #include <windows.h> typedef int (*lpE_Pro_KillProcessByName)(IN const char* pchar_param_ProName); int main(int argc, char *argv[]) { HINSTANCE hDll; //DLL句柄 lpE_Pro_KillProcessByName KillProcessByName; hDll = LoadLibr

vb.net调用dll直接奔溃

问题描述 这里有三个问题:1.程序中调入dll时,直接崩溃,需要重启VS2008:2.程序调入dll,在调试过程中并未出错,但如果运行debug中的exe文件会出错:3.即使在vs2008中调试,每一次启动电脑时仍需重新加载dll,程序才能正常运行:请问大神如何解决? 解决方案 解决方案二:这个应该是DLL的问题吧!跟踪下DLL代码,看是否有问题???

在C#中动态调用native dll的导出函数

动态|函数 在 C++ 中我们能够通过 LoadLibrary,  GetProcAddress 来动态调用 dll 的导出函数.在 C# 中也能够用这样的方式吗?在 DotNet 2.0 里面这样是可以的, 这完全得益于 2.0新增的一个函数Marshal.GetDelegateForFunctionPointer 方法 此方法在 .NET Framework 2.0 版中是新增的. 将非托管函数指针转换为委托. 实例代码如下: public delegate int MsgBox(int h