问题描述
一个连接接口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……
学习下