VB6.0调用C# Dll文件总结

在工作中遇到了在VB6.0的程序里要调用C#的Dll的问题,显然这两个开发环境属于不同的平台。在网上拜读了几位大师的文章后,在实际试验中还是会发生这样那样的问题,最后还是实现了预期效果,在此我把我的实验步骤和注意事项分享如下,希望对需要之人有所帮助:

实验环境:

C#dll的创建使用的是VS2008;VB6.0

一、C#部分

1.用C#创建一个ClassLibrary项目(VS2008);

2.所有在VB6中要使用的方法都必须通过继承接口实现,并且为public的(非常重要,没有继承接口实现的方法,在VB6.0里面无法调用);

3.接口和类都需要加入属性Guid;  

Guid通过VS2008自带的工具得到:

4.在VS2008的DOS命令工具提示框中运行:

sn -k C:\myKey.snk<回车>

在C盘根目录下生成一个强名称文件:myKey.snk(注意这个强名称文件的名字可以自己定义,我暂定为myKey.snk)

5. 右击项目,选择属性,打开并编辑项目的属性对话框

在Application tab中,点击Assembly Information按钮,在打开的对话框中选中“make Assembly COM-Visible”(重要)

在Build Tab中,最好用Release模式编译,确认选中“Make assembly COM-Visible”(重要)。

在Signing Tab中引入上一步创建的强名称文件myKey.snk

6. 检查项目的AssemblyInfo文件,ComVisible应设为true,项目和文件版本不为1.0.*,应该是一个具体的值;

7.编译这个项目,生成dll文件。

到此为止,C#的Dll部分已经准备完毕了。

二、VB6部分

1. VB6调用环境必须安装.Net framework 2.0或以上版本,最好是3.5(和VS2008相同的framework);

2. 复制dll文件进入VB6环境的目标文件夹,例如D:根目录, D:\TestCom.dll

3. 在Dos命令窗口用regasm命令注册这个dll文件生成.tlb文件

regasm D:\TestCom.dll /tlb:D:\TestCom.tlb /codebase

在D:\将会生成一个TestCom.tlb文件

4.在Dos命令窗口用gacutil命令添加Dll文件到GAC中(全局程序集缓存),这样这个Dll文件在这个PC中就可以随处使用

gacutil /I D:\TestCom.dll

5.在VB6项目中,把生成的.tlb文件加入到项目(References)

6. VB6代码即可调用tlb文件

Private Sub Command1_Click()

  Dim obj As New t0426a.Class1

  Form1.Label1.Caption = obj.GetString()

End Sub

注意:以上3,4步,需要在VB6环境的C:\WINDOWS\system32下面有相应的exe文件才可运行;第4步,可以省去;

还要说明的是,当转移这个VB6生成的exe程序(这个VB6可执行文件引用了C#的dll)到另外一台电脑上的时候,需要把这个C# Dll文件一同Copy到那台电脑上,并且重新执行第3步的注册生成tlb文件的工作,否则这个exe程序无法运行。

参考文献:

http://www.cnblogs.com/martin1009/archive/2012/02/09/2344254.html

http://blog.csdn.net/smallboy_5/article/details/3007553

http://www.cnblogs.com/michaelxu/archive/2010/03/30/1700445.html

http://www.codeproject.com/Articles/7859/Building-COM-Objects-in-C

http://helpdeskgeek.com/how-to/fix-not-recognized-as-an-internal-or-external-command

 

转载于:https://www.cnblogs.com/bob79/archive/2012/11/06/2757263.html

### 回答1: 在VB6.0,当我们使用C语言编写的动态链接库(DLL,通常需要先将DLL文件注册到系统,然后在VB6.0引用该DLL调用其函数或方法。这是因为在注册过程,系统会为DLL文件创建相应的条目,从而使得VB6.0能够通过系统来访问和调用DLL。 然而,在某些情况下,我们可能希望直接调用未注册的DLL文件。这种情况下,我们可以使用VB6.0的Declare语句来声明DLL函数的原型,然后在代码直接调用该函数。 具体是这样操作的:首先,在VB6.0打开模块,然后在模块使用Declare语句声明DLL函数的原型,例如: Private Declare Function MyFunction Lib "MyDll.dll" (ByVal x As Integer) As Long 在上面的例子,我们声明了一个名为MyFunction的函数,它位于名为MyDll.dllDLL文件,它接受一个整型参数x,并返回一个长整型值。 接下来,我们就可以在VB6.0的代码直接调用该函数,例如: Dim result As Long result = MyFunction(10) 这样,我们就成功地实现了在VB6.0直接调用未注册的DLL文件的功能。需要注意的是,这种方式在编译是不会检查函数是否存在或参数是否匹配的。所以,在使用这种方式,我们需要谨慎处理参数型和数量的问题,以避免调用失败或引发运行错误。 总之,虽然VB6.0通常需要注册DLL文件才能调用的函数,但是我们也可以使用Declare语句来直接声明DLL函数的原型并在代码调用该函数,从而实现在不注册DLL的情况下直接调用C语言编写的DLL的功能。 ### 回答2: 在使用VB6.0调用C函数,通常需要注册对应的DLL文件。但是,如果我们不希望注册DLL文件,仍然可以直接调用C函数。 首先,我们需要将C函数封装到一个动态链接库(Dynamic Link Library,简称DLLDLL是一种可以供多个程序共享的可执行文件,它包含了一些函数和数据,可以在运行调用。 然后,在VB6.0,我们可以使用Declare语句来声明C函数的原型。这样,VB6.0就知道了该函数的参数和返回值型,以便正确地调用该函数。 接下来,在VB6.0直接调用C函数,我们需要使用LoadLibrary函数加载C函数所在的DLL文件。LoadLibrary函数返回一个表示DLL的句柄,我们可以使用该句柄来调用DLL的函数。 最后,通过使用GetProcAddress函数获取DLL函数的入口点地址,我们就可以直接调用C函数了。使用GetProcAddress函数,需要传入DLL句柄和函数名,它会返回函数的地址,然后我们可以使用该地址来调用C函数。 需要注意的是,使用VB6.0直接调用C函数,我们需要自己管理和处理内存。这包括在调用C函数,正确传递参数和处理返回值的内存。因此,在直接调用C函数之前,我们需要详细了解C函数的参数和返回值的内存布局和处理方式。 总的来说,尽管VB6.0一般需要注册DLL文件来正确调用C函数,但是如果我们愿意花费更多的精力来自行封装和管理内存,我们仍然可以直接在VB6.0调用未注册的DLL文件的C函数。 ### 回答3: 在VB6.0,可以通过DLLImport声明来直接调用C语言编写的DLL文件,而无需对该DLL文件进行注册。 首先,需要通过VB6.0的Declare语句来声明C语言DLL所需的函数、参数和返回型。然后,可以在VB6.0直接调用此函数,而无需事先注册DLL文件。 在VB6.0,声明C语言DLL函数的语法如下: Declare Function 函数名 Lib "DLL文件路径" ([参数列表]) As 返回型 其,函数名是C语言DLL的函数名,DLL文件路径是DLL文件的路径和文件名,参数列表是函数的参数列表,返回型是函数的返回值的数据型。 通过这样的声明,可以将C语言DLL的函数与VB6.0的函数进行关联,实现直接调用。 需要注意的是,在使用Declare语句声明DLL函数,要确保函数名、参数数量和型、返回型等都与C语言DLL的实际情况保持一致,否则可能会引发编译或运行错误。 在调用,可以像调用VB6.0自身的函数一样使用声明的C语言DLL函数,无需进行额外的注册操作。 总之,通过VB6.0的Declare语句,我们可以直接调用C语言编写的DLL函数,而无需事先注册DLL文件。这为在VB6.0使用C语言的功能提供了便利。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值