扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
在C#中有 静态类 的概念 自然里边全部的方法都是静态的 这意味着你可以直接通过 类名 方法名 去调用(例如System的Math类就是典型) 在VB NET中 没有 静态类 的概念(当然你可以用 单例模式 把构造函数弄成Private的方式 其它方法都是静态的)如果某些方法需要被其它地方频繁使用 可以创建 模块 在VB NET中一旦创建了模块 其中任何方法 属性或者变量都可以被其它地方引用 因此适合全局情况下频繁交互的情况(比如初始化加载的参数 可能后续程序要使用)等
建宁网站制作公司哪家好,找成都创新互联!从网页设计、网站建设、微信开发、APP开发、响应式网站设计等网站项目制作,到程序开发,运营维护。成都创新互联2013年开创至今到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选成都创新互联。
现在问题在于 如果你把一个类似以下的模块代码封装成DLL类库 无论在C#或者是VB NET中都无法引用到其方法
Module A
Public Sub Test()
End Sub
End Module
或许你感到很奇怪——不是在VB NET中这样定义一个Module就直接可以使用其内部方法了么?为什么封装成类库就不可以了呢?上网问了一些人 众说纷纭 后来我在他人协助下终于成功解决了这个问题——解决方法很简单——只要在Module前加Public
理由是 为了兼容C# VB NET由Module封装成类库中这个模块不再是 模块 而是一个标准的类了 如果这样写 那么在 NET中被理解成(C#)
internal A
{
public void Test()
{
}
}
整个模块变成Internal的了!当然你到其它程序集中去引用就引用不到!而把类库中的Module的修饰符改为Public就可以了 这就是MSDN那位友人给我最好的提示
虽然这个提示不是令我太满意(因为要知道VB NET中可以直接不通过 类名 方式直接使用方法名) 但是这给了我很大的暗示 得出重要的结论
)VB NET中Module在制作成类库时候等同于VB NET中的类的规则(里边的方法都是静态的) 默认情况下是Friend(C#是internal)
)根据结论 那么我们知道引用该DLL类库的方法一定是 i)引用命名空间 ii)C#中直接 类名 方法名 对于VB NET 直接可以引用到方法名
lishixinzhi/Article/program/net/201311/12502
一般VB.NET调用DLL可以通过Declare 语句在模块级用于声明对动态链接库 (DLL) 中的外部过程的引用。
Private Declare Sub
myFunc1 Lib "mylib.dll"
(ByVal strName As String)
但是,VB.NET,C#.NET创建的DLL是个类库,不能生成标准的 DLL 文件,不能采用declare ()的方式。应该在解决方案资源管理器下的需要引用的项目的引用栏点击鼠标右键--添加对这个类库[mylib.dll]的引用即可。
以下为VB.NET调用DLL代码示例:
DllImport("kcomm.dll", CharSetCharSet:
=CharSet.Ansi, SetlastError:=True)
Private Shared Function gettxt(ByVal
port As Integer, ByVal wait As
Integer, ByVal _date As Long,
ByVal _time As Long, ByVal
filename As String) As Integer
End Function
根据实际情况更改你的DLL名称、函数名、参数名和类型。
VB.NET调用DLL的只是COM组件,无法作为输出函数的DLL,其实这只是个错误的说法。其实MS非常狡猾,如果你是个VB疯狂发烧友的话,应该早就狂试出这种可以创建输出函数的DLL的方法。
VB编译文件实际上采取了两次编译的方法,首先是调用C2.exe产生*.OBJ文件,然后调用Link.EXE连接。如果在LINK的时候添加EXPORT选项,实际上是可以输出函数的。但是,在VB的工程选项中将这些屏蔽了。而且过分的是:VB在Build完成后会将OBJ文件删除,这样就无法手动通过Link来创建我们需要的DLL了。不过我找到一个比较龌鹾的变通的方法,就是先创建一个Exe工程,在Form_Load事件里面写下面的语句:
Sub Main
If MsgBox("哈哈",
vbOKCancel) = vbOK Then
Shell "link2.exe "
Command$
End If
End Sub
然后编译为LinkTemp.EXE,接下来将LINK.EXE改名为Link2.exe,将LinkTemp.EXE改名为Link.EXE。这样在VB调用Link.EXE时会弹出对话框,处理就会中断。这时就可以有机会将OBJ文件拷贝出来了。
然后我创建了一个ActiveX DLL工程,在这个工程里面添加一个Module并创建一个Public函数mathadd:
Public Function mathadd
(ByVal a As Long, ByVal
b As Long) As Long
mathadd = a + b
End Function
编译这个工程,在Link的时候就会中断。然后把创建的Class1.obj、Module1.obj、Project1.obj备份出来。然后就可以调用Link2.exe连接OBJ到DLL了,我的连接代码是:
Link2.exe "e:\\vbdll\\Class1.obj"
"e:\\vbdll\\Module1.obj"
"e:\\vbdll\\Project1.obj"
"E:\\Program Files\\Microsoft
Visual Studio\\VB98\\VBAEXE6.LIB"
/ENTRY:__vbaS /EXPORT:mathadd /OUT:
"e:\\vbdll\\ProjectOK.dll"
/BASE:0x11000000 /SUBSYSTEM:
WINDOWS,4.0 /VERS
注意里面的/ENTRY和/EXPORT开关,/EXPORT开关声明了输出函数mathadd。这样就大功告成了,可以被其他语言引入,例如在VB中,只需要:
Private Declare Function mathadd
Lib "e:\\vbdll\\ProjectOK.dll"
(ByVal a As Long, ByVal b As
Long) As Long
1. 什么是类和对象?
答:类包含某一类对象的数据和过程。对象是类的实例。
2. 为什么采用类和对象进行程序设计?
答:以便按照对象定义类,提高程序代码的可重用性,避免重复劳动。
3. 在同一个类中,应当包括哪些对象的属性和方法?
答:同一类对象的数据和过程。
4. VB程序设计主要包括哪两个方面的内容?
答:Windows应用程序界面和代码。
5. 什么是事件驱动?
答:根据事件转去执行相应的事件处理过程。
1. 控件是窗体上的 对象 。
2. Visual Basic具有 BASIC程序语言简单易学的 优点,新增了 可视化和面向面向对象程序设计的 热点,是 Windows编程人员广泛使用的编程 工具。
3. 对象的 属性 是在其类中定义的数据。
4. 对象的 方法 是在其类中定义的过程。
5. 对象本身的动作或功能称为 方法 ,外界施加于某对象的动作或操作称为 事件 。
1.面向过程
是指从功能的角度分析问题,将待解决的问题空间分解成若干个功能模块,每个功能模块描述一个操作的具体过程。
2.面向过程程序设计
主要是根据事务本身的逻辑过程进行编程的一种方法。
3.面向对象程序设计
是一种计算机编程架构,是由单个能够起到子程序作用的单元或对象组合而成。即按照对象编写程序。
4.事件驱动程序设计
是一种电脑程式设计模型。这种模型的程式执行流程是由使用者的动作或者是由其他程式的讯息来决定的。
5.函数
是一种特定的运算,在程序中使用一个函数时,只要给出函数名并给出一个或多个参数,就能得到它的函数值
6.过程
是程序中可以执行的一段代码,过程包含在一个声明语句和一个结束语句之间
7.类
是所有具有共同特征的事物的抽象,是一个抽象的概念(类是一组具有相同属性特征的对象的抽象描述,是面向对象程序设计的又一个核心概念或者类是对一组对象共同具有的属性和行为的抽象,具有封装和隐藏性、还具有继承性)。
8.对象
是一个属性集合及其操作的封装体(对象是用来描述现实世界中客体的部件,是面向对象软件系统在运行时刻的基本单位)。
类是对象的抽象,对象是类的实例。
9.事件
窗体或控件识别的动作
10.事件驱动
根据事件转去执行相应的事件处理过程。
11.属性
是一个对象的特性,不同的对象有不同的属性
12.算法
指解决某个问题的严格方法,描述有始有终的计算过程。
5.属性窗口中属性值被设置的方式有哪几种?
6种:输入 选取 浏览 赋值 默认 拖动
1.程序代码是由一行一行的 语句 所组成。
3.在程序代码中可将一个语句分成两段的特殊符号为( _ )。
5.数值变量如果没有设置初值,则内定值为 0 。
7.如果有一个变量,可能会存放数值数据或字符串数据,此时可以声明该变量为 对象变量。
9. Integer数据类型占 4 bytes的内存空间,可以表示的数值范围为 -2,147,483,648~2,147,483,647 的整数
3.VB.NET程序语言数据类型的种类有哪些?
(1)数值型
①整形数:短整形(Short)、整形(Integer)、长整型(Long)
②字节型(Byte)
③实型数:单精度型(Single)、双精度型(Double)
④货币型(Decimal)
(2)字符型(Char)和字符串型(String)
(3)逻辑型/布尔型(Boolean)
(4)日期型(Date)
(5)对象型(Object)[即可变型(Variant)]
1.局部变量、全局变量、跨模块变量分别在何处声明?其生存期分别是多少?
局部变量在程序内声明。生存期为从所在的程序运行开始到程序结束。
全局变量在窗体内所有程序的外边声明。生存期为由该变量声明开始,一直到程序退出运行为止。
跨模块变量在一般模块的声明区用Public来声明。生存期为从一个Windows应用程序项目文件开始运行到结束。
3.什么是静态变量?
静态变量是在离开程序时能够继续保留目前的值,待下回进入该程序时能够继续保留的变量值的局部变量,用Static关键字声明。
(一)问答题
1.请简单说明在程序中使用程序的好处。
(1)程序可以重复使用,以方便维护与程序调试。
(2)程序可以让其他工程或项目使用。
(3)程序的逻辑简单、明确,可以让程序变得简单且可读性高。
(4)程序具有模块化的功能,因此可以将一个大的应用程序分成数个小的且不同功能的程序,让不同的程序设计师分别编写独立不同功能的程序,并以团队开发,加快应用程序开发的时间。
3.试比较传值调用与传址调用的差异。
(1)声明方式不同:
传值——在程序中的虚自变量之前加上ByVal
传址——在程序中的虚自变量之前加上ByRef
(2)占用内存不同
传值——调用程序的实自变量与被调用程序的虚自变量占用不同内存
传址——调用程序的实自变量与被调用程序的虚自变量占用同一地址的内存,也就是说,在做参数传递时,调用程序中的实自变量是将自己本身的内存地址传给被调用程序的虚自变量
(3)虚自变量更改结果不同
传值——使用传值调用可以防止变量被程序修改
传址——被调用程序可以通过虚自变量将值传回给调用程序
5.什么是程序多载?
程序多载是使用不同的自变量串行或数据类型来加以区分相同名称的程序。
我的思路是,新建一个“类库”项目,在项目里编写一个类,然后生成,就会得到dll文件。在别的项目里,添加对这个dll文件的引用,就可以使用我们编写的类了。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流