VB.net编写的dll,供vb6调用时dll中的函数不可见?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VB.net编写的dll,供vb6调用时dll中的函数不可见?相关的知识,希望对你有一定的参考价值。

我用VB.net编写的dll,勾选了注册COM和程序集COM可见了,生成的dll再用RegAsm注册dll得到tlb文件了,在vb6中成功引用了该tlb库文件,同时,也成功的使用了 Dim Img As New YCImageDo 了,但是,当执行 Img.的时候,Img类里面的任何属性和函数和过程都 是不可见的。请问这问题如何解决?或者哪位帮编译一下呢,该dll的代码全写好了的。
终于自己找到解决方案了:
Imports System.Runtime.InteropServices
<ComVisible(True)>
<ClassInterface(ClassInterfaceType.AutoDual)>
Pubic Class YCImageDo
。。。。。。
End Class

在您的代码中,您已经成功使用了RegAsm命令将DLL注册为COM组件,并在VB6中成功引用了该组件的类型库文件(TLB文件)。此外,您还在VB6代码中声明了一个YCImageDo类型的对象,并成功创建了该对象。
但是,当您尝试使用YCImageDo对象的属性和方法时,却发现这些成员不可见。这可能是因为在编写DLL代码时您没有正确地声明这些成员的可见性。
在VB.NET中,您可以使用"Public"关键字来声明一个类型的成员(属性、方法、过程等)对外可见,而使用"Private"关键字则声明该成员仅在类型内可见。如果您希望YCImageDo类型的成员在VB6代码中可见,则应将这些成员声明为Public类型。
例如,如果您希望YCImageDo类型拥有一个名为"GetImage"的方法,则可以在DLL代码中按如下方式声明该方法:
Public Function GetImage() As String
' 在这里编写方法的代码
End Function
同样,如果您希望YCImageDo类型拥有一个名为"ImagePath"的属性,则可以在DLL代码中按如下方式声明该属性:
Public Property ImagePath As String
参考技术A 一般dll可以通过Declare 语句在模块级用于声明对动态链接库 (DLL) 中的外部过程的引用。

Private Declare Sub myFunc1 Lib “mylib.dll” (ByVal strName As String)

但是,VB.NET,C#.NET创建的DLL是个类库,不能生成标准的 DLL 文件,不能采用declare ()的方式。应该在解决方案资源管理器下的需要引用的项目的引用栏点击鼠标右键–>添加对这个类库[mylib.dll]的引用即可。追问

终于自己找到解决方案了:
Imports System.Runtime.InteropServices

Pubic Class YCImageDo
。。。。。。
End Class

参考技术B 为你的类及函数过程创建一个接口,在VB或者VBA中用接口创建对象,即可以用点操作符,实际上只要COM没有问题,不用接口的话也可以调用的,就是不方便。假设你的类名为img,接口命名为Iimg,在VB中这样定义:
Dim obj as Iimg
set obj=new img
然后用obj.就有提示了。
具体实现
在你COM项目中复制你的类代码然后粘贴一份,把Class改为Interface,删掉所有内部成员变量和对象以及函数实体,删掉函数前面public修饰,以及函数结尾(End Sub/Function),调试检查直到没有错误为止。
类似下面这种结构
Public Interface Imyclass
Function Display() As String
End Interface追问

终于自己找到解决方案了:
Imports System.Runtime.InteropServices

Pubic Class YCImageDo
。。。。。。
End Class

vb.net 如何调用dll . 调用时总是出错. 找不到入口点..无法返回值... 需要详细的.谢谢!

dll 文件已试过无法应用,,无法注册....

DLL在生成后,里内的函数会有变化,所以你要先用软件exesc查一下它变化的结果是什么
之后这样写,我是用C#写的,对你应该有帮助
[DllImport("facecom.dll", EntryPoint = "?fnfacecom@@YAHXZ")]
public extern static int fnfacecom();
?fnfacecom@@YAHXZ
这个就是那个就是在软件里查到的改变后的结果,你写在入口号处就可以了
这个我用过了没问题
参考技术A 不同的dll编制的方式不同,从类型上还有的是库、有的是控件,并不是说一个方式可以打开大部分dll ,那么谁还制作dll,有安全性么 参考技术B 你要确保dll文件 有接入点啊。。。追问

调用的是dephi编写的dll...用dephi调用就可以..但用vb.net 和C# 都提示找不到接入点..
能提供一般的调用方法吗?

追答

可能你那个库不支持vb.net 或C#调用吧。

以上是关于VB.net编写的dll,供vb6调用时dll中的函数不可见?的主要内容,如果未能解决你的问题,请参考以下文章

VB.net调用DLL,捕捉到AccessVioationException尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

如何在 VB6 中使 VB.NET DLL 可调用?

创建 VB.NET COM DLL

vb.net如何调用dll(动态链接库)

从 VB6 调用 C dll,其中 dll 是使用 Visual Studio 2013 编写的

vb.net把dll放到程序的Resources资源里面,能直接调用Resources里面的dll吗?