.net框架是com的一个自然发展,两者共享许多核心要素,这包括组件的再利用以及语言的种 立性。
为了向后兼容,com interop可以使用现存的com组件而不要求对原始组件进行修改。当一个
框架开发人员想将com代码合并到一个管理应用程序中时,就可以用com interop功能引入相相关的co
类型。引入之后,这个com类型就可以使用了。这属于前期连接。但是有时候你需要对象的汉 期连接,
这在.net中也能实现,使用名称空间映射就可以通过后期连接来调用com对象。
这里介绍一个应用程序例程,它将调用excel,并且通过使用后期连接使它可视。
后期连接将使用reflectionb的type类,这个type类有许多方法可以取得com对象,
gettypefromprogid("application"),这个方法从系统注册表中得到com id,
然后使用static类的成员 activator.createinstance()创建这个com对象的一个新例示。
要想调用com对象的方法、函数和属性,就必须使用包含正确设置的type对象的invokemethood()方法。
这个方法接受一些参数变量,其中最重要的一个是方法类型的ex属性(get或set)。在例子子中我们?
excel.visible使用了set属性,从而使excel应用程序可视。
我们将尝试在.net环境中调用excel应用程序。这是一个后期连接应用程序,因为如果是前破 连接的话
就需要使用com对象的rcw(runtime callable wraper)来完成下面的命令行程序tblimp所屯 成的任务:
ex. c:\> tblimp /out:
//variable
type excel;
object[] parameter= new object[1];
object excelobject;
try
{
excel = type.gettypefromprogid("excel.application");
excelobject = activator.createinstance(excel);
parameter[0] = true;
excel.invokemember("visible", bindingflags.setproperty, null, excelobject, parammeter);
}
catch(exception e)
{
console.writeline("error stack {0} ", e.message) ;
}
finally
{
//when this object is destroyed the excel application will be closed
//so sleep for sometime and see the excel application
thread.sleep(5000);
//relaese the object
//gc.runfinalizers()
}
1.如何读取windows注册表信息?
public static int main(string[] args)
{
registrykey subkey;
registrykey tawkay = registrykey.openremotebasekey(microsoft.win32.registryhive..currentuser,"");
string subkey = "software\\taw\\bse";
subkey = tawkay.opensubkey(subkey);
object dsn = subkey.getvalue("dsn");
object user = subkey.getvalue("user");
object password = subkey.getvalue("password");
object server = subkey.getvalue("server");
return 0;
}
2.如何调用windows api?
在c#中调用一个apiapi的dll名称,并且使用sysimport引入它。
下面这个例子显示了如何调用messagebox api:
using system;
class callapicls {
[sysimport(dll="user32.dll")]
public static extern int messageboxa(int h, string m, string c, int type);
public static int main()
{
return messageboxa(0, "hello world!", "caption", 0);
}
}
3.如何获取机器上正在运行的进程?
使用system.diagnostics.process类可以启动和停止系统进程。
getprocesses函数返回了机器上正在运行的所有进程,
public static process[] getprocesses();
public static process[] getprocesses(string);
eg.
using system.diagnostics;
.....
process[] proclist = new process[100];
proclist = process.getprocesses();
for ( int i=0; i<20; i++)
{
string strprocname = proclist[i].processname;
int iprocid = proclist[i].id;;
}
通过使用process类的方法,甚至可以启动、停止或取消进程:
在应用程序中打开浏览器
system.diagnostics.process.start("http://www.c-sharpcorner.com");
打开wav文件
可以用playsound api来播放一个wav文件。
[sysimport(dll="winmm.dll")]
public static extern long playsound(string lpszname, long hmodule, long dwflags));
......
playsound( szwavfilename , 0 , 0);
4.如何在c#中发送邮件?
涉及到的名称空间有system.web.util,集合有system.web.dll。
可用smtpmail类在c#应用程序中发送邮件。默认状态下,
邮件在系统中是排队的,smtpmail类在system.web.util名称空间中定义。
可以通过两种途径来调用send方法:
public static void send(mailmessage);
smtpmail.send("mcb@mindcracker.com", "webmaster@mindcracker.com", "subject",
"message body");
5.使用系统剪贴板
涉及的集合是system.winforms.dll,名称空间是system.winforms。
在c#中,clipboard类提供了将数据放在系统剪贴板以及从系统剪贴板恢复数据的方法。
在.net中,使用dataformat类,它执行idataobject,为数据传输提供了一种格式独立的结构埂?
clipboard类只有3个成员,它们是构造器、getdataobject和setdataobject。
setdataobject方法有两个定义:
public static void setdataobject(object);
public static void setdataobject(object data, bool copy);
copy这个参数指明应用程序退出后,数据是否应该保留在剪贴板上。
getdataobject方法
public static idataobject getdataobject();
6.获取主机的ip地址
// call dns.gethostname to get iphostentry and get the ip address list.
iphostentry ipentry = dns.gethostbyname ("www.mindcracker.com");
ipaddress [] ipaddr = ipentry.addresslist;
for (int i = 0; i < ipaddr.length; i++)
{
console.writeline ("ip address {0}: {1} ", i, ipaddr[i].tostring ());
}
另外,使用无参数的gethostname可以返回本地机器的主机名:
string strhostname = dns.gethostname ();
然后将这个主机名作为参数传递给gethostbyname,就可以获取本地机器的ip地址信息。
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!


