.net开发

[导入][翻译]在Visual Studio中调试JavaScript – hufeiyan79′s Blog
http://hufeiyan79.gjjblog.com/archives/777702/
[ RSS聚合新闻摘录: ]

原文地址:http://aspalliance.com/1096_Debugging_JavaScript_in_Visual_Studio

在Visual Studio中调试JavaScript
原文发布日期:2006.12.19

摘要
一个好的应用程序在把所有的输入项提交至服务器处理之前都要先通过验证,所以客户端验证是必需的。几乎所有的浏览器都支持的JavaScript便可以非常好的完成这个任务。

作者:Rajendra Kumar Sahu

文章内容
介绍
配置
结论

介绍
事实上,web应用程序相对于桌面应用程序来说,升级起来更加方便。如我们从应用程序的立场来看这两种技术的发展,无疑,web应用程序已经比桌面应用程序更流行了。web应用程序的设计师不同于桌面应用程序的设计师,web页是由静态的html标记,图片,脚本标记和JavaScript构成的。web页与web服务端相结合的,通过浏览器把请求交付给服务端进行处理。在今天,有很多种不同的web服务器。流行的有IIS,WebSphere,Weblogic,Apache等。web服务器是用来处理脚本的,而处理这些脚本的是一些基本的类库。当一个页从浏览器发送请求到服务端时并不会转换html标记,解释和解析这些html标记的工作是由浏览器负责的。

web页在今天已经变得越来越有互动性了,它经常收集用户的输入并且发送这些信息到服务端去处理。所以,在页面中验证每一个输入便成了开发者工作的一部分。web页端的验证已经是必须要做的工作了。如果不做客户端验证,那么就可能会有一些错误的请求,而这些错误的请求将导致web应用程序抛出一个错误信息甚至崩溃。除了在服务端进行输入验证外,客户端验证也是必需的。现在有一些流行的脚本就可以用于客户端验证,JavaScript和VBScript就是其中的两个。没有专门应付web端验证的脚本使得开发者陷入了一个窘迫的境地。当今时代,用户更喜欢在客户端做更多事情,而只有在必须的时候才交给服务端处理。

这种技术完全是在客户端进行处理,它不是ajax(Asynchronous Java and XML)。我在一些场合用到了ajax,它确实是很强大而且不同JavaScript的,但在ajax中仍然会需要用到大量的JavaScript。开发人员不得不把大量的逻辑代码写成JavaScirpt,而随着JavaScript使用的大量增加,越来越多的时间就会用于调试和修改这些JavaScript。微软的Visual Studio IDE可以让开发人员非常容易的写代码,而且调试也相对于传统的asp应用程序简单得多。放下VS IDE的一些新特性不说,很多人发现调试JavaScript很不方便。但是现在你可以通过一些配置使调试JavaScript变得简单起来。那么该如何来做呢?接下来将告诉你一些在asp.net中调试JavaScirpt的技巧。

asp.net中一步一步调试JavaScript,在这篇文章里我使用了IIS和Visual Studio 2005。

配置
第一步:
在Visual Studio 2003/05中打开一个已经存在的asp.net应用程序,其中要有一些JavaScript。

第二步:
当我们在微软的Visual Studio中创建了一个web项目,那么一个名为web.config的文件默认也被创建在了该web项目中。
我们检查一下它的设置

<compilation debug=”false” strict=”false” explicit=”true” />


把debug的属性该为true,如下

<compilation debug=”true” strict=”false” explicit=”true” />


第三步:
打开Internet 信息服务(IIS)管理器
开始->管理工具->Internet 信息服务(IIS)管理器->网站->默认网站->右键单击你想调试的web项目->属性->虚拟目录选项卡->配置->在新打开的windows窗口中选择调试选项卡->把“启用 ASP 服务器端脚本调试”和“启用 ASP 客户端脚本调试”两个复选框选中。(请看截图1)
图1

第四步:
打开IE,单击菜单栏的“工具”->Internet 选项->高级选项卡->取消“禁用脚本调试(Internet Explorer)”和“禁用脚本调试(其他)”两个复选框的选中状态。(请看截图2)
图2

第五步:
现在,在Visual Studio IDE打开你的web项目。
注意:JavaScript一定要放到一个单独的.js文件里,而不能直接在.aspx页里写JavaScript。然后像对待.cs或.vb文件一样,在.js文件里给某行添加断点即可。

第六步:
运行你的web项目,程序将会在运行到你设置的断点处停止。

结论
[原文源码下载]
这是一个非常简单的调试JavaScript的例子。

webabcd 2007-01-06 09:34 发表评论


文章来源:http://www.cnblogs.com/webabcd/archive/2007/01/06/613343.html

alee 2007-02-05 22:35 发表评论

…………本文来自各大互联网博客RSS输出摘录,版权归原作者所有!
文章信息如下:
引用RSS源博文网址:http://www.cnblogs.com/alee/archive/2007/02/05/641283.html

~☆~庆生~☆~
[田中芳树]銀河英雄伝説 1-10
三国病人
然然的颜色理论
喜庆时刻

Visual Studio 2003 向 Visual Studio 2005 的移植
Visual Studio 2003 SP1,Visual Studio 2005 SP1和Orcas
Visual Studio2005 + Visual SourceSafe 2005 实现团队开发、源…
Visual Sidekick (Visual Studio Add-in)
Visual Studio 2005 SP1 and Visual Basic 2005 Command-line C…
Visual Studio Unit Testing Extends to Visual Studio Profess…
《Visual FoxPro 权威指南》新增内容——Visual FoxPro Sedna B…
re: Visual Studio 2005 SP1 Beta and Visual Studio support f…
Porting Visual C++ Code to Visual Studio 2005
[ZZ]HOW TO:使用 Visual Studio .NET 将 SQL Server 2000 存储�…
《Anime Studio Pro v5》(Anime Studio Pro v5)v5
《CodeGear RAD Studio 2007》(CodeGear RAD Studio 2007)11.0.2…

百度搜索:[导入][翻译]在Visual Studio中调试JavaScript
Google搜索:[导入][翻译]在Visual Studio中调试JavaScript
雅虎搜索:[导入][翻译]在Visual Studio中调试JavaScript
SOSO搜索:[导入][翻译]在Visual Studio中调试JavaScript

web开发(aspx.net)

URL Encoding
(or: ‘What are those “%20″ codes in URLs?’)

= Index DOT Html by Brian Wilson =

Main Index | Element Index | Element Tree | HTML Support History
RFC 1738 | Which characters must be encoded and why
How to URL encode characters | URL encode a character

RFC 1738: Uniform Resource Locators (URL) specification

The specification for URLs (RFC 1738, Dec. ’94) poses a problem, in that it limits the use of allowed characters in URLs to only a limited subset of the US-ASCII character set:

“…Only alphanumerics [0-9a-zA-Z], the special characters “$-_.+!*’(),” [not including the quotes - ed], and reserved characters used for their reserved purposes may be used unencoded within a URL.”

HTML, on the other hand, allows the entire range of the ISO-8859-1 (ISO-Latin) character set to be used in documents – and HTML4 expands the allowable range to include all of the Unicode character set as well. In the case of non-ISO-8859-1 characters (characters above FF hex/255 decimal in the Unicode set), they just can not be used in URLs, because there is no safe way to specify character set information in the URL content yet [RFC2396.]

URLs should be encoded everywhere in an HTML document that a URL is referenced to import an object (A, APPLET, AREA, BASE, BGSOUND, BODY, EMBED, FORM, FRAME, IFRAME, ILAYER, IMG, ISINDEX, INPUT, LAYER, LINK, OBJECT, SCRIPT, SOUND, TABLE, TD, TH, and TR elements.)

What characters need to be encoded and why?


ASCII Control characters
Why: These characters are not printable.
Characters: Includes the ISO-8859-1 (ISO-Latin) character ranges 00-1F hex (0-31 decimal) and 7F (127 decimal.)
Non-ASCII characters
Why: These are by definition not legal in URLs since they are not in the ASCII set.
Characters: Includes the entire “top half” of the ISO-Latin set 80-FF hex (128-255 decimal.)
“Reserved characters”
Why: URLs use some characters for special use in defining their syntax. When these characters are not used in their special role inside a URL, they need to be encoded.
Characters:
Character Code
Points
(Hex)
Code
Points
(Dec)
Dollar (“$”)
Ampersand (“&”)
Plus (“+”)
Comma (“,”)
Forward slash/Virgule (“/”)
Colon (“:”)
Semi-colon (“;”)
Equals (“=”)
Question mark (“?”)
‘At’ symbol (“@”)
24
26
2B
2C
2F
3A
3B
3D
3F
40
36
38
43
44
47
58
59
61
63
64
“Unsafe characters”
Why: Some characters present the possibility of being misunderstood within URLs for various reasons. These characters should also always be encoded.
Characters:
Character Code
Points
(Hex)
Code
Points
(Dec)
Why encode?
Space 20 32 Significant sequences of spaces may be lost in some uses (especially multiple spaces)
Quotation marks
‘Less Than’ symbol (“<”)
‘Greater Than’ symbol (“>”)
22
3C
3E
34
60
62
These characters are often used to delimit URLs in plain text.
‘Pound’ character (“#”) 23 35 This is used in URLs to indicate where a fragment identifier (bookmarks/anchors in HTML) begins.
Percent character (“%”) 25 37 This is used to URL encode/escape other characters, so it should itself also be encoded.
Misc. characters:
Left Curly Brace (“{“)
Right Curly Brace (“}”)
Vertical Bar/Pipe (“|”)
Backslash (“\”)
Caret (“^”)
Tilde (“~”)
Left Square Bracket (“[")
Right Square Bracket ("]“)
Grave Accent (“`”)
7B
7D
7C
5C
5E
7E
5B
5D
60
123
125
124
92
94
126
91
93
96
Some systems can possibly modify these characters.

How are characters URL encoded?


URL encoding of a character consists of a “%” symbol, followed by the two-digit hexadecimal representation (case-insensitive) of the ISO-Latin code point for the character.
Example
  • Space = decimal code point 32 in the ISO-Latin set.
  • 32 decimal = 20 in hexadecimal
  • The URL encoded representation will be “%20″

URL encoding converter


The box below allows you to convert content between its unencoded and encoded forms. The initial input state is considered to be “unencoded” (hit ‘Convert’ at the beginning to start in the encoded state.) Further, to allow actual URLs to be encoded, this little converter does not encode URL syntax characters (the “;”, “/”, “?”, “:”, “@”, “=”, “#” and “&” characters)…if you also need to encode these characters for any reason, see the “Reserved characters” table above for the appropriate encoded values.

NOTE:
This converter uses the String.charCodeAt and String.fromCharCode functions, which are only available in Javascript version 1.2 or better, so it doesn’t work in Opera 3.x and below, Netscape 3 and below, and IE 3 and below. Browser detection can be tiresome, so this will just fail in those browsers…you have been warned. 8-}

No
Encoding
URL-Safe
Encoding

Browser Peculiarities


  • Internet Explorer is notoriously relaxed in its requirements for encoding spaces in URLs. This tends to contribute to author sloppiness in authoring URLs. Keep in mind that Netscape and Opera are much more strict on this point, and spaces MUST be encoded if the URL is to be considered to be correct.

请问:web application 和 web service 的区别是什么? .NET技术 / Web Services – CSDN社区 community.csdn.net
http://topic.csdn.net/t/20020830/19/984137.html

你会在C#的类库中添加web service引用吗? – ASP.NET2.0 – 博客园
http://www.cnblogs.com/ASPNET2008/archive/2008/09/16/1292028.html

你会在C#的类库中添加web service引用吗?

本文并不是什么高深的文章,只是VS2008应用中的一小部分,但小部分你不一定会,要不你试试:

本人对于分布式开发应用的并不多,这次正好有一个项目要应用web service,我的开发环境是vs2008,之所以没有选择现在热门的WCF,本人有如下原因:

1:负责开发Web Service的小组对于vs2008应用不多,更不能奢望令人垂涎的WCF。
2:项目开发时间有限,根本不许你去拿项目做实验。
3:项目改动不大,web service足够对付需求。

由于我们的项目是从1.1直接升级到3.5,升级的时候,把web项目直接改成类库,这样无论环境发生多大的变化,只要能够兼容低级版本,所有原来的文件都是能用的,例如,1.1中创建一个网页,会有一个resx的资源文件,但是3.5中创建的网页则是designer.cs,以后如果再升级,只要把相关新文件类型创建好,然后添加到类库中,这样同样可以享用高级版本的功能,说的比较含糊,不知道大家是否明白。

现在要做的就是在这样的类库中引用web service,凭直觉就认为,只要添加一下引用不就行了吗?其实是这样的吗?

先说下在web application项目中如何引用:
第一:对web项目点击右键,如图一。

第二:点击添加web 引用,如下图二.


第三:查找可用的web service,如果是本解决方案内的直接搜索就行,如果是外部的,就输入有效地址然后查询,这里面可以测试web service,如图三:

第四:添加引用成功后就会出现Web References目录.如图四,然后就是调用了。

这应该就是最基本的添加web service引用的方法了。当时我也是按照这样的思路去添加。发现类库中点击右键并没有出现我熟悉的 “添加web 引用”,而出现图五效果:

此时我认为可能是升级的原因变成”添加服务引用“,接下来的操作和上面操作相同.点击出现图六;

输入web service地址,测试连接都成功,添加成功后出现图七:

然而调用的时候并不像想像的那么成功,结果可想而之,我添加的WCF服务。这里错误代码我就不好意思帖了。知道引用对象错了后,就是让类库来添加web service,然而点击类库后,右键并没有”添加web 服务“的选项。如何让类库支持添加web service引用成了我最大的难题。此时我咨询了同事,基本排除程序问题,因为通过网站形式可以正常访问web service。

园子里的朋友你们在VS08中的类库会添加web servece引用吗?我baidu了一下午,毫无结果,最好只好再问别的同事,几经周折,有一个太有才的同事说类库可以添加web service引用,我不敢相信,我把方法贴出来show一下;

第一:对目标类库点击右键,如图六:
第二:点击“添加服务引用”如图八:

关键是图左下角的“高级”按键。点击如图九:

第三:注意了,同样是左下角,“添加WEB引用”的按钮终于出现了,点击如图十:之后的操作就不多说了。

到这里,就最终完成了类库中添加web service引用的目的。操作并不复杂,只是实在是想不明白,VS为什么要把添加web引用放的这么隐蔽呢,难道是为了WCF的推广?

Tag标签: C#,.NET

posted on 2008-09-16 21:05 姜敏 阅读(2464) 评论(17) 编辑 收藏 网摘 所属分类: ASP.NET2.0

Feedback

#1楼 2008-09-16 21:53 ocean

兄弟,我也不知道这个问题怎么解释,我经常用,从来没发现这个问题,至少我这里本身就有add web service菜单。 回复 引用 查看

#2楼 2008-09-16 22:03 ocean

还有一个问题就是,对于一个web service来说,你添加服务引用也是没有任何问题的,因为生成本地代理类就是通过web service或者WCF的元信息来生成的。我刚刚又验证了一下,我通过add service的形式添加了一个web servcie,仍然可以正常运行成功,也印证了我原先的理解。你的那个选项应该只是按照完全的.NET2.0的形式来生成代理类,而VS2008生成的代理类有一些改进。
换句话说,你可以将web service看成一种特殊的WCF。   回复 引用 查看

#3楼 [楼主] 2008-09-16 22:06 姜敏

@ ocean
对,如果你不是在类库中添加就不会遇到以上问题   回复 引用 查看

#4楼 2008-09-16 22:06 潮儿

@ocean
博主说的是类库,你那个好像是web应用程序吧。   回复 引用 查看

#5楼 2008-09-16 22:09 Steven Chen

@ocean
今天下午刚刚用添加WCF的方式添加了WebService,发现不能工作,最后按照lz的方法添加的。

你说能工作,看来是我有些地方没有做对,明天公司再看看代码。   回复 引用 查看

#6楼 [楼主] 2008-09-16 22:10 姜敏

对于web application来说,应该是没有问题的,这里 ocean有实验,本人并没有亲自实验过.对于class librairy来说,朋友们不妨亲自试下.有些东西不亲自遇到还真不知道其中的困难.   回复 引用 查看

#7楼 [楼主] 2008-09-16 22:12 姜敏

@Steven Chen
看来这个问题还不止我一人遇到过啊,希望给朋友带来些帮助.   回复 引用 查看

#8楼 2008-09-16 22:18 Steven Chen

俄 果然如lz所说,webApplication出现了 添加Web引用, 但是类库项目,Console程序,Winform程序都不可以的。

我想可能是MS的一个小Bug,或者说MS不想让我们在用以传统的WebService的client了,而是使用类似于WCFClient的咚咚。   回复 引用 查看

#9楼 2008-09-16 22:21 ocean

刚刚没仔细看,不好意思。
我又试验了一下类库,新建了一个类库,然后add service,然后再在web app里面引用这个类库,结果一样,完全能调用啊。
你在类库里面add service还是在web app里面add service,都是用同一个命令行工具来生成代理类的,我比较了一下他们生成的代理类,好像没什么区别。所以在类库里面添加web service直接add service就可以了。我认为那个额外的选项只是为了生成完全和.NET2.0一模一样的代理类的,而VS2008带的代理类生成工具,生成的代理类和VS2005生成的有些差异的。我们也可以用一个命令行自己生成代理类,那个命令我忘记了,你可以自己查查。
其实我觉得不难理解,微软没有道理为web app和class lib各写一个代理类生成工具,所以生成的代理类应该完全一样的。   回复 引用 查看

#10楼 2008-09-16 22:25 Steven Chen

@ocean
应该是我某个操作没有弄好,明天再去公司看看,多谢   回复 引用 查看

#11楼 2008-09-16 22:25 ocean

我认为你可以先写一个简单的web service试验一下,看看是否正常。另外我认为可以单步调式一下,看看不能正常工作的原因。因为你add service的方式去添加一个web service,能成功生成代理类,所以VS2008是完全支持这种方式的,如果都不能工作,那就根本不会给你生成代理类了。
当然我的web service也是在VS2008里面写的,不知道有没有关系,不过web service是个标准,用VS2005和VS2008写好像没什么关系吧。   回复 引用 查看

#12楼 2008-09-16 22:36 Steven Chen

作了个测试,WebService可以通过VS生成的WCFClient调用,多谢ocean   回复 引用 查看

#13楼 [楼主] 2008-09-16 23:14 姜敏

@ocean
有是否有试过这们的情况,你的web网站,并不是web app而就是一个类库呢?你这样试下,类库也是可以当网站运行的,只是不能添加web app里面的文件,只能手工加.在没有web app的情况下试下,看添加web服务是否成功.我认为是不可靠的.   回复 引用 查看

#14楼 2008-09-17 10:41 赵俊

标题党,你文章的名字应该改为
“你会在C#的类库中添加web service引用吗? ”   回复 引用 查看

#15楼 [楼主] 2008-09-17 12:13 姜敏

@赵俊
谢谢指正,已经修改.   回复 引用 查看

#16楼 2008-09-17 17:11 狼Robot


楼主的VS2008什么版本的,我的就有添加web引用.
回复 引用 查看

#17楼 2008-09-17 17:43 飘遥

1.项目属性改成.net2.0即可
2.VS生成了一陀无关的代码和文件,WSDL很好用,如果不想硬编码URL,在配置文件中手工配置。   回复 引用 查看

标题 请输入标题
姓名 请输入你的姓名
主页
Email (博主才能看到)邮件地址无效
请输入验证码
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容) 请输入评论内容
Remember Me?
登录 使用高级评论 新用户注册 返回页首 恢复上次提交
[使用Ctrl+Enter键可以直接提交]
该文被作者在 2008-09-17 12:12 编辑过
Google站内搜索

China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!
开发者征途系统新作:《设计模式——基于C#的工程化实现及扩展》
所属分类的其他文章:
什么样的情况下你能对工作好高骛远
<a

此项目的URL位于Internet区域 – 半亩方塘 – CSDNBlog
http://blog.csdn.net/vipxiaotian/archive/2008/03/13/2176090.aspx

转载 此项目的URL位于Internet区域收藏

新一篇: Installing UrlRewriter.NET on Windows Server 2003旧一篇: SQL Server 中易混淆的数据类型以及数据类型详解

无法在Web服务器上启动调试。您不具备调试此应用程序的权限,此项目的URL位于Internet区域

一般用下面的方法可以解决:
1:确认在“配置属性”中的“启用ASP.NET调试”为”True”
2:确认你的”web.config”中的”debug=true”
3:若你安装过Win2000 SP4后,则要在命令行执行”regsvr32 i aspnet_isap.dll”
4:在IIS里查看站点信息,选中”目录安全性”,里面有”匿名访问和身份验证控制”,再点击”编辑..”,确认”集成Windows身份验证”选项被选中
5:在IE选项->”安全设置”->”自定义级别”里有”用户验证”,确认选中”自动使用当前用户名和密码登录”
6:运行C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\aspnet_regiis.exe -i
7:控制面板–管理工具–计算机管理–本地用户和组–用户,双击ASPNET用户,为其隶属于添加Administrators用户

我的问题用第5种方法解决了

远端查看错误信息

“/FormServer”应用程序中的服务器错误。
——————————————————————————–

运行时错误
说明: 服务器上出现应用程序错误。此应用程序的当前自定义错误设置禁止远程查看应用程序错误的详细信息(出于安全原因)。但可以通过在本地服务器计算机上运行的浏览器查看。

详细信息: 若要使他人能够在远程计算机上查看此特定错误信息的详细信息,请在位于当前 Web 应用程序根目录下的“web.config”配置文件中创建一个 <customErrors> 标记。然后应将此 <customErrors> 标记的“mode”属性设置为“Off”。

<!– Web.Config 配置文件 –>

<configuration>
<system.web>
<customErrors mode=”Off”/>
</system.web>
</configuration>

注释: 通过修改应用程序的 <customErrors> 配置标记的“defaultRedirect”属性,使之指向自定义错误页的 URL,可以用自定义错误页替换所看到的当前错误页。

<!– Web.Config 配置文件 –>

<configuration>
<system.web>
<customErrors mode=”RemoteOnly” defaultRedirect=”mycustompage.htm”/>
</system.web>
</configuration>

.net程序开发

[转载] C#调用COM组件_冷枫(SpaS)的自留地
http://hi.baidu.com/buildingit/blog/item/0fa9d382c91f43bd6c8119a5.html
转载] C#调用COM组件
2007-07-27 22:33
这部分描述了在托管代码中调用COM组件的方法,
现存的COM组件在托管代码中作为中间件或者独立的功能实体是很有价值的资源
.NET Framework报露COM组件
1. Import a type library as an assembly
COM的类型定义通常在type librarytlb)中,与之对应的是CLS兼容的编译器在assembly中产生类型元数据(type metadata),这两种类型信息的来源有很大的不同
Generating Metadata
COM的类型库(type libraries)可以是一个单独得Tlb文件,例如Loanlib.tlb。一些类型库被嵌入到DLL或者Exe的资源文件中,还有一些类型库在OLB或者OCX中。
找到包含你的COM类型的类型库之后,可以有以下的选择来生成包含元数据的交互程序集(interop assembly
Option
Description
Visual Studio .NET
Automatically converts COM types in a type library to metadata in an assembly.
Type Library Importer
Provides command-line switches to adjust metadata in the resulting interop file, imports types from an existing type library, and generates an interop assembly and a namespace.
TypeLibConverter Class
Exposes methods that perform conversion-related actions. Can convert in-memory type library information to metadata.
Custom Wrappers
As a less desirable option, you can create type definitions from scratch. This requires advanced programming skills.
当添加一个给定的type library 的引用(reference)时,Visual Studio .NET生成包含元数据的交互程序集(interop assembly)。如果一个主交互程序集(primary interop assembly)有效的话,Visual Studio使用存在的assembly
To add a reference to a type library
1.       Install the COM DLL or EXE file on your computer, unless a Windows Setup.exe performs the installation for you.
2.       From the Project menu, select References.
3.       Select the COM tab.
4.       Select the type library from the Available References list, or browse for the TLB file.
5.       Click OK.
Type Library Importer
The Type Library Importer (Tlbimp.exe)是一个命令行的工具,它可以把COM的类型库中的Coclassedinterfaces转换成元数据。
使用方法:
tlbimp Loanlib.dll
TypeLibConverter Class
TypeLibConverter classin the System.Runtime.InteropServices namespace)提供了转换类型库中的coclassesinterfaces到元数据的方法。
Custom Wrappers
当一个类型库不可用或者不正确时,一个可选的方法就是在托管代码重创建一个class或者interface定义的副本。然后编译代码在runtime在程序集中产生元数据
手动定义COM类型,必须遵循如下
准确的描述定义的coclassesinterfaces
一个编译器,例如C#编译器可以生成对应的.NET Framework的类的定义
type library-to-assembly转化规则的相关知识
写一个自定义的包装类(wrapper)是一项应该很少使用的高级的技术。
2. Using COM Types in Managed Code
COM 在程序集中类型定义类似其他的托管代码。托管的客户可以使用通常的方式创建COM类型的新的实例并且像其他托管类一样通过元数据得到类的信息。方法的语法可以通过object viewer或者反射(reflection)得到。当COM的方法返回一个失败的结果时,.NET的客户得到一个对应的异常。
得到或者释放一个运行的COM对象的引用像得到或者释放其他的运行的托管对象的引用一样。当一个.NET的客户端得到或者释放COM对象的引用,运行时像其他的COM客户端那样维护COM对象的引用计数,.NET的客户端可以认为对象可以像其他的托管对象那样被垃圾收集。
下面是C#的客户端代码
[C#]
using System;
using LoanLib;
public class LoanApp {
public static void Main(String[] Args) {
Loan ln = new Loan();
if (Args.Length < 4)
{
Console.WriteLine(“Usage: ConLoan Balance Rate Term Payment”);
Console.WriteLine(“     Either Balance, Rate, Term, or Payment
must be 0″);
return;
}
ln.OpeningBalance = Convert.ToDouble(Args[0]);
ln.Rate = Convert.ToDouble(Args[1])/100.0;
ln.Term = Convert.ToInt16(Args[2]);
ln.Payment = Convert.ToDouble(Args[3]);
if (ln.OpeningBalance == 0.00) ln.ComputeOpeningBalance();
if (ln.Rate == 0.00) ln.ComputeRate();
if (ln.Term == 0) ln.ComputeTerm();
if (ln.Payment == 0.00) ln.ComputePayment();
Console.WriteLine(“Balance = {0,10:0.00}”, ln.OpeningBalance);
Console.WriteLine(“Rate     = {0,10:0.0%}”, ln.Rate);
Console.WriteLine(“Term     = {0,10:0.00}”, ln.Term);
Console.WriteLine(“Payment = {0,10:0.00}\n”, ln.Payment);
bool MorePmts;
double Balance = 0.0;
double Principal = 0.0;
double Interest = 0.0;
Console.WriteLine(“{0,4}{1,10}{2,12}{3,10}{4,12}”, “Nbr”, “Payment”,
“Principal”, “Interest”, “Balance”);
Console.WriteLine(“{0,4}{1,10}{2,12}{3,10}{4,12}”, “—”, “——-”,
“———”, “——–”, “——-”);
MorePmts = ln.GetFirstPmtDistribution(ln.Payment, out Balance,
out Principal, out Interest);
for (short PmtNbr = 1; MorePmts; PmtNbr++) {
Console.WriteLine(“{0,4}{1,10:0.00}{2,12:0.00}{3,10:0.00}
{4,12:0.00}”, PmtNbr, ln.Payment, Principal, Interest,
Balance);
MorePmts = ln.GetNextPmtDistribution(ln.Payment, ref Balance,
out Principal, out Interest);
}
}
}
标签: C#, COM

CSDN技术中心 c# 中调用COM组件
http://dev.csdn.net/article/19/19144.shtm

首先将Com类型信息转换为.NET元数据
tlbimp sample.dll /out: sample_clw.dll

工具:Tlbimp.exe(类型库导入程序 )
参考:.Net framework SDK 文档
ms-help://MS.NETFrameworkSDK.CHS/cptools/html/cpgrftypelibraryimportertlbimpexe.htm

查看元数据

工具:ILDasm
参考:ms-help://MS.NETFrameworkSDK.CHS/cptutorials/html/il_dasm_tutorial.htm

测试程序
生成一个console programme
在project->add reference里,选择com,browser你的com,select
ok,现在在你的bin目录下应该有一个sample_clw.dll了

下面我们来用sample_clw的方法

using System;
using sample_clw;
namespace CompConsole
{
/// <summary>
/// Class1 的摘要说明。
/// </summary>
class Class1
{
/// <summary>
/// 应用程序的主入口点。

/// Date:2003/6/20
/// </summary>
[STAThread]
static void Main(string[] args)
{
//
// TODO: 在此处添加代码以启动应用程序
Console.Write (“=======Demo for Call com functions in c#=============\n”);

sampleClass sam = new sampleClass();
//now we call functions
//
sam.SayHello();
}
}
}

标签: C#, COM

HOW TO: 使用 Visual C# .NET 与返回一致数组的 COM 服务器互操作
http://support.microsoft.com/kb/305990/zh-cn

HOW TO: 使用 Visual C# .NET 与返回一致数组的 COM 服务器互操作

文章编号 : 305990
最后修改 : 2007年5月13日
修订 : 1.4
本文的发布号曾为 CHS305990

概要

本文逐步介绍如何与返回一致数组的 COM 服务器互操作。

下面的文件可以从 Microsoft 下载中心下载:

有关如何下载 Microsoft 支持文件的其他信息,请单击下面的文章编号,查看 Microsoft 知识库中的文章:

119591 (http://support.microsoft.com/kb/119591/EN-US/) How to Obtain Microsoft Support Files from Online Services(如何从联机服务获取 Microsoft 支持文件)

在发表当日 Microsoft 使用了最新的病毒检测软件以扫描此文件是否有病毒。一旦发表后,此文件就保存在安全服务器上,以防对它进行未经授权的更改。

回到顶端

COM 服务器示例

本示例中使用的服务器实现下面的接口:

interface IComArrsObj : IDispatch
{
   HRESULT GetArrOfLongs([in] LONG nStartIdx, [in,out] LONG* pnCnt,
                         [out,size_is(,*pnCnt)] LONG** ppArr);
   HRESULT GetArrOfUDTs ([in] LONG nStartIdx, [in,out] LONG* pnCnt,
                         [out,size_is(,*pnCnt)] MyUDT** ppArr);
   HRESULT MyNextLongs  ([in] LONG nReq, [out, size_is(nReq)] LONG *rgelt,
                         [out] LONG* pnFetched);
   HRESULT MyNextUDTs   ([in] LONG nReq, [out, size_is(nReq)] MyUDT* rgelt,
                         [out] LONG* pnFetched);
};

如此接口规范所示,本文介绍如何与返回 Long 值和用户定义类型 (UDT) 的数组的 COM 服务器互操作。 该代码还演示了服务器分配的数组(即 GetArrOfXxx 方法)和客户端分配的数组(即 MyNextXxx 方法,它们模仿 IEnumXxx 接口中的 Next 方法)之间的区别。

GetArrOfXxx 方法使用下面三个参数:

? nStartIdx 是一个 [in] 参数,它指定传递回客户端的第一个元素的索引。
? pnCnt 是一个 [in, out] 参数,它等于客户端在进入时请求的项数,以及服务器在退出时提供的项数。 如果在进入时 pnCnt 为 0,那么服务器就返回所有可用的元素。
? ppArr 是一个由服务器分配的 [out] 数组。 其大小等于 *pnCnt

MyNextXxx 方法使用下面三个参数:

? nReq 是一个 [in] 参数,它指定客户端请求的项数。
? rgelt 是一个 [out] 参数,它由客户端分配并由服务器填充。 只有第一个 *pnFetched 元素是有效的。
? pnFetched 是一个 [out] 参数,它指定由服务器填充的项数。

回到顶端

对 COM Interop 方法的讨论

通常,在与 COM 服务器互操作时,有下面几种选择:

? 使用 interop 程序集与 COM 服务器通讯。 如果有主 interop 程序集,则应使用该程序集。 否则,可以使用 Tlbimp.exe 实用工具或 Visual Studio .NET 的导入功能生成 interop 程序集。
? 直接在 Visual C# .Net 源代码中声明 COM 对象和接口。 如果需要与 COM 服务器公开的有限个对象和接口互操作,则可使用此选项。
? 您可以增强上面任一选择,做法是:添加一个托管类,该类为与 COM 服务器互操作所需要的粗略导入类提供一个熟悉的托管接口。

如果有主 interop 程序集,则始终应使用该程序集,因为主 interop 程序集提供一个经过充分测试的,经证明可靠的 interop 层来访问 COM 服务器功能。 在主 interop 程序集可用时,仍可以选择第三种方式,并为主 interop 程序集导出的类型提供托管接口。

在主 interop 程序集不可用时,所选择的方式取决于应用程序是否需要公开从 COM 服务器导入的类型。 在应用程序包括多个程序集,而这些程序集交换从 COM 服务器导入类型的数据时,可能会发生这种情况。

如果托管应用程序包含多个程序集,而这些程序集使用 COM 服务器并且需要公开从 COM 服务器导入的数据类型,则应使用共享程序集来定义 interop 程序集。 在这种情况下,强烈建议使用主 interop 程序集。

如果不需要在各程序集间公开 COM 服务器中的数据类型,则可以为 interop 程序集使用私有程序集(第一种选择)或者在 Visual C# .Net 代码中定义 COM 类型(第二种选择)。

有关更多信息,请访问下面的 Microsoft Developer Network (MSDN) Web 站点:

使用 Interop 程序集

如果有主 interop 程序集,则始终应使用该程序集。 使用主 interop 程序集提供了一个经过充分测试的,经证明可靠的 interop 层来访问 COM 服务器功能。 此外,Tlbimp.exe 提供了一种自动生成 interop 程序集的方法,自动生成代码具有一些优点,如速度快,正确率高。 此外,当托管客户端需要访问由 COM 服务器公开的大量方法和接口时,则不能使用第二种选择。 在这些情况下,可以使用 interop 程序集访问 COM 服务器所提供的功能。 可以使用下列方法之一获取 interop 程序集:

? 从发布 COM 服务器(需要与其互操作)的软件供应商获取主 interop 程序集。
? 从 Visual Studio .NET 生成主 interop 程序集。 若要调用 Tlbimp.exe 生成需要的 interop 程序集,请单击项目菜单上的添加引用,单击 COM 选项卡,然后选择 COM 服务器的条目。
? 手动生成 interop 程序集。 为此,在 COM 服务器类型库(即 .tlb、.dll、.ocx 或 .exe 文件)上调用 Tlbimp.exe。 与依赖 Visual Studio .NET 的默认命令行参数相比,这使您对 Tlbimp.exe 有更好的控制。
? 为了获得最大的灵活性,请按照下列步骤操作:
?
1. 使用 Tlbimp.exe 生成 interop 程序集的第一个版本,然后在该程序集上运行 Ildasm.exe。 为此,在命令提示符处键入 ildasm Interop.Srvr.dll /out=Interop.Srvr.il
2. 手动编辑生成的中间语言代码以指定所需要的封送处理行为。
3. 使用 Ilasm.exe 获取项目中引用的最后一个 interop 程序集,重新汇编中间语言代码。 为此,在命令提示符处键入 ilasm /dll Interop.Srvr.il /out=Interop.Srvr.dll

由于 COM 类型库格式的局限性,Tlbimp.exe 无法为本文示例中的 COM 服务器生成正确的接口定义。 因此,本文中的示例使用第四种选择。 若要使用此选择,请按照下列步骤操作:

1. 在 COM 服务器动态链接库 (DLL) 上运行 Tlbimp.exe,如下所示:
2.
   > tlbimp /out:Interop_1.ComArrs_1_0.DLL /namespace:ComArrs_1 ComArrs.DLL
3. 在生成的 DLL 上运行 Ildasm.exe,如下所示:
4.
   > ildasm /out=Interop_1.ComArrs_1_0.IL Interop_1.ComArrs_1_0.DLL
5. 在生成的中间语言文件中修改方法签名,以便根据您的需要修改封送处理。 每个方法在中间语言中都出现两次,因此必须在接口的声明和类的声明中进行这些更改:

   .method public hidebysig newslot virtual abstract
           instance void  GetArrOfLongs([in] int32 nStartIdx,
                                        [in][out] int32& pnCnt,
                                        // Replace this: [out] native int ppArr) runtime managed internalcall
                                        // with this:
                                        [out] native int& ppArr) runtime managed internalcall
   .method public hidebysig newslot virtual abstract
           instance void  GetArrOfUDTs([in] int32 nStartIdx,
                                       [in][out] int32& pnCnt,
                                       // Replace this: [out] valuetype ComArrs_1.MyUDT&  marshal( lpstruct) ppArr) runtime managed internalcall
                                       // With this:
                                       [out] native int& ppArr) runtime managed internalcall
   .method public hidebysig newslot virtual abstract
           instance void  MyNextLongs([in] int32 nReq,
                                 // Replace this: [out] int32& rgelt,
                                 // With this:
                                 [out] int32[] marshal([ + 1]) rgelt,
                                 [out] int32& pnFetched) runtime managed internalcall
   .method public hidebysig newslot virtual abstract
           instance void  MyNextUDTs([in] int32 nReq,
                                     // Replace this: [out] valuetype ComArrs_1.MyUDT& rgelt,
                                     // With this:
                                     [out] valuetype ComArrs_1.MyUDT[] marshal([ + 1]) rgelt,
                                     [out] int32& pnFetched) runtime managed internalcall
6. 使用 Ilasm.exe 重新生成 interop 程序集,如下所示:

   > ilasm /dll /resource=Interop_1.ComArrs_1_0.res Interop_1.ComArrs_1_0.il /out=Interop_1.ComArrs_1_0.dll
7. 在 Visual C# .Net 客户端项目中引用新的 interop 程序集。 为此,请单击项目菜单上的添加引用,然后浏览到最近生成的 DLL。
8. 在托管客户端编写测试代码,如下所示:

   public static void Run ( )
   {
      Console.WriteLine ( "\nTesting hand-edited IL of TlbImp-ed COM class:" );
      Console.WriteLine (   "=============================================:" );

      Console.WriteLine ( "Creating COM object" );
      ComArrs_1.CComArrsObj o = new ComArrs_1.CComArrsObj ( );

      Console.WriteLine ( "Calling GetArrOfLongs( )" );
      int cnt = 0;
      IntPtr rAddr;
      o.GetArrOfLongs ( 0, ref cnt, out rAddr );
      int [ ] r = new int [ cnt ];
      // Marshal the array from an unmanaged to a managed heap.
      Marshal.Copy ( rAddr, r, 0, cnt );
      // Release the unmanaged array.
      Marshal.FreeCoTaskMem ( rAddr );
      Utils.PrintArray ( r, elementFormatter );

      Console.WriteLine ( "Calling GetArrOfUDTs( )" );
      cnt = 0;
      IntPtr ruAddr;
      o.GetArrOfUDTs ( 0, ref cnt, out ruAddr );
      ComArrs_1.MyUDT [ ] ru = new ComArrs_1.MyUDT [ cnt ];
      // Marshal the array, element by element, from an unmanaged to a managed heap.
      for (int i = 0, elemOffs = (int) ruAddr; i < cnt; i++ )
      {
          ru[i] = ( ComArrs_1.MyUDT ) Marshal.PtrToStructure (
                         (IntPtr) elemOffs, typeof ( ComArrs_1.MyUDT ) );
          elemOffs += Marshal.SizeOf ( typeof ( ComArrs_1.MyUDT ) );
      }
      // Release the unmanaged array.
      Marshal.FreeCoTaskMem ( ruAddr );
      Utils.PrintArray ( ru, elementFormatter );

      Console.WriteLine ( "Calling MyNextLongs( )" );
      int [ ] q = new int [ 20 ];
      // The marshalling is performed automatically.
      o.MyNextLongs ( q.GetLength(0), q, out cnt );
      Utils.PrintArray ( q, elementFormatter );

      Console.WriteLine ( "Calling MyNextUDTs( )" );
      ru = new ComArrs_1.MyUDT[20];
      // The marshalling is performed automatically.
      o.MyNextUDTs ( ru.GetLength(0), ru, out cnt );
      Utils.PrintArray ( ru, elementFormatter );
   }

为 COM 服务器使用 C# 声明

与使用 interop 程序集相比,此选择的优势在于消除了提供另一个文件(即 interop 程序集)的必要。

若要指定必需的元素并调用方法,请按照下列步骤操作:

备注: 由“COM 服务器示例”部分提供的 COM 接口开始。

1. 如下所示定义 UDT:
2.
   // MyUDT as defined in the server.
   [Guid("190A418D-B113-40d4-A22C-20EF9EAC3E33")]
   [StructLayout(LayoutKind.Sequential)]
   struct MyUDT
   {
      [MarshalAs(UnmanagedType.BStr)]
      public string   aBstr;
      public int      aLong;
      public bool     aBool;
   }
3. 如下所示定义 COM 接口:
4.
   // A possible C# representation of the interface.
   [InterfaceType(ComInterfaceType.InterfaceIsDual),
      Guid("78D4F391-B10B-4B80-A2D1-1B4C583DCAEC")]
   interface IComArrsObj
   {
      void GetArrOfLongs(int startIdx, ref int cnt, out IntPtr arrAddr);
      void GetArrOfUDTs (int startIdx, ref int cnt, out IntPtr arrAddr);
      void MyNextLongs  (int req,
                         [MarshalAs(UnmanagedType.LPArray, Out]
                         int [ ] rgelt,
                         out int fetched);
      void MyNextUDTs   (int req,
                         [MarshalAs(UnmanagedType.LPArray, Out]
                         MyUDT [ ] rgelt,
                         out int fetched);
   }
5. 如下所示定义 COM 服务器:

   // The coclass.
   [ComImport, Guid("056A32CF-D716-4902-BCD2-ED7F070D9E36")]
   class CComArrsObj
   {
   }
6. 如下所示在 COM 服务器上调用方法:

   public static void Run ( )
   {
      Console.WriteLine ( "\nTesting C#-declared COM class and interfaces:" );
      Console.WriteLine (   "============================================:" );

      Console.WriteLine ( "Creating COM object" );
      ComArrs_0.IComArrsObj icao = new ComArrs_0.CComArrsObj ( )
                                       as ComArrs_0.IComArrsObj;

      Console.WriteLine ( "Calling GetArrOfLongs( )" );
      int cnt = 0;
      IntPtr rAddr;
      icao.GetArrOfLongs ( 0, ref cnt, out rAddr );
      int [ ] r = new int [ cnt ];
      // Marshal the array from an unmanaged to a managed heap.
      Marshal.Copy ( rAddr, r, 0, cnt );
      // Release the unmanaged array.
      Marshal.FreeCoTaskMem ( rAddr );
      Utils.PrintArray ( r, elementFormatter );

      Console.WriteLine ( "Calling GetArrOfUDTs( )" );
      cnt = 0;
      IntPtr ruAddr;
      icao.GetArrOfUDTs ( 0, ref cnt, out ruAddr );
      ComArrs_0.MyUDT [ ] ru = new ComArrs_0.MyUDT [ cnt ];
      // Marshal the array, element by element, from an unmanaged to a managed heap.
      for ( int i = 0, elemOffs = (int) ruAddr; i < cnt; i++ )
      {
         ru[i] = ( ComArrs_0.MyUDT ) Marshal.PtrToStructure (
                        (IntPtr) elemOffs, typeof ( ComArrs_0.MyUDT ) );
         elemOffs += Marshal.SizeOf ( typeof ( ComArrs_0.MyUDT ) );
      }
      // Release the unmanaged array.
      Marshal.FreeCoTaskMem ( ruAddr );
      Utils.PrintArray ( ru, elementFormatter );

      Console.WriteLine ( "Calling MyNextLongs( )" );
      int [ ] q = new int [20];
      // The marshalling is performed automatically.
      icao.MyNextLongs ( q.GetLength(0), q, out cnt );
      Utils.PrintArray ( q, elementFormatter );

      Console.WriteLine ( "Calling MyNextUDTs( )" );
      ru = new ComArrs_0.MyUDT [20];
      // The marshalling is performed automatically.
      icao.MyNextUDTs ( ru.GetLength(0), ru, out cnt );
      Utils.PrintArray ( ru, elementFormatter );
   }

添加托管包装类

托管包装类可以基于前面两个选择中的任何一个。 它可以使用第一个选择中 TlbImp 生成的包装,也可以封装对 COM 服务器的 Visual C# .Net 声明的引用。 若要使用后一个选择来生成托管包装类,请按照下列步骤操作:

1. 添加一个对包含 COM 服务器的托管定义的 interop 程序集的引用。
2. 依据 TlbImp 生成的类定义托管包装类,如下所示:
3.
   class MgdComArrs
   {
      public MgdComArrs ( )
      { cao_ = new ComArrs_1.CComArrsObj( ); }

      public int [ ] GetArrOfLongs ( int startIdx, ref int cnt )
      {
         IntPtr rAddr;
         cao_.GetArrOfLongs ( startIdx, ref cnt, out rAddr );
         int [ ] r = new int [ cnt ];
         // Marshal the array from an unmanaged to a managed heap.
         Marshal.Copy ( rAddr, r, 0, cnt );
         // Release the unmanaged array.
         Marshal.FreeCoTaskMem ( rAddr );

         return r;
      }

      public ComArrs_1.MyUDT [ ] GetArrOfUDTs ( int startIdx, ref int cnt )
      {
         IntPtr ruAddr;
         cao_.GetArrOfUDTs ( startIdx, ref cnt, out ruAddr );
         ComArrs_1.MyUDT [ ] ru = new ComArrs_1.MyUDT [ cnt ];
         // Marshal the array, element by element.
         for ( int i = 0, elemOffs = (int) ruAddr; i < cnt; i++ )
         {
            ru[i] = (ComArrs_1.MyUDT) Marshal.PtrToStructure (
                          (IntPtr) elemOffs, typeof ( ComArrs_1.MyUDT ) );
            elemOffs += Marshal.SizeOf ( typeof ( ComArrs_1.MyUDT ) )'
         }
         // Release the unmanaged array.
         Marshal.FreeCoTaskMem ( ruAddr );

         return ru;
      }

      public int MyNextLongs ( int req, int [ ] r )
      {
         int fetched;
         cao_.MyNextLongs ( req, r, out fetched );
         return fetched;
      }

      public int MyNextUDTs ( int req, ComArrs_1.MyUDT [ ] r )
      {
         int fetched;
         cao_.MyNextUDTs ( req, r, out fetched );
         return fetched;
      }

      private ComArrs_1.CComArrsObj cao_;
   }
4. 如下所示编写客户端代码:
5.
   public static void Run ( )
   {
      Console.WriteLine ( "\nTesting managed wrapper definition of COM class:" );
      Console.WriteLine (   "===============================================:" );
      Console.WriteLine ( "Creating managed wrapper" );
      MgdComArrs mcao = new MgdComArrs( );

      Console.WriteLine ( "Calling GetArrOfLongs( )" );
      int cnt = 0;
      int [ ] r = mcao.GetArrOfLongs ( 0, ref cnt );
      Utils.PrintArray ( r, elementFormatter );

      Console.WriteLine ( "Calling GetArrOfUDTs( )" );
      cnt = 0;
      ComArrs_1.MyUDT [ ] ru = mcao.GetArrOfUDTs ( 0, ref cnt );
      Utils.PrintArray ( ru, elementFormatter );

      Console.WriteLine ( "Calling MyNextLongs( )" );
      int [ ] q = new int [ 15 ];
      mcao.MyNextLongs ( q.GetLength ( 0 ), q );
      Utils.PrintArray ( q, elementFormatter );

      Console.WriteLine ( "Calling MyNextUDTs( )" );
      ru = new ComArrs_1.MyUDT [ 5 ];
      mcao.MyNextUDTs ( ru.GetLength ( 0 ), ru );
      Utils.PrintArray ( ru, elementFormatter );
   }

回到顶端

参考

有关更多信息,请访问下面的 Microsoft Developer Network (MSDN) Web 站点:

Data Marshaling(数据封送处理)
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguidnf/html/cpcondatamarshaling.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguidnf/html/cpcondatamarshaling.asp)

Interop Marshaling for COM(COM 的 Interop 封送处理)
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguidnf/html/cpconinteropmarshalingforcom.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguidnf/html/cpconinteropmarshalingforcom.asp)

Applying Interop Attributes(应用 Interop 属性)
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguidnf/html/cpconapplyinginteropattributes.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguidnf/html/cpconapplyinginteropattributes.asp)

Deploying an Interop Application(部署 Interop 应用程序)
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguidnf/html/cpcondeployinginteropapplication.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguidnf/html/cpcondeployinginteropapplication.asp)

Microsoft Intermediate Language (MSIL)(Microsoft 中间语言)
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguidnf/html/cpconmicrosoftintermediatelanguagemsil.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguidnf/html/cpconmicrosoftintermediatelanguagemsil.asp)

Type Library Importer (Tlbimp.exe)(类型库导入程序)
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cptools/html/cpgrftypelibraryimportertlbimpexe.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cptools/html/cpgrftypelibraryimportertlbimpexe.asp)

MSIL Disassembler (Ildasm.exe)(MSIL 反汇编程序)
http://msdn2.microsoft.com/en-us/library/f7dy01k1(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/f7dy01k1(vs.71).aspx)

ILDasm Tutorial(ILDasm 教程)
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cptut/html/il_dasm_tutorial.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cptut/html/il_dasm_tutorial.asp)

MSIL Assembler (Ilasm.exe)(MSIL 汇编程序)
http://msdn2.microsoft.com/en-us/library/496e4ekx(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/496e4ekx(vs.71).aspx)

COM Interop Sample: .NET Client and COM Server(COM Interop 示例:.NET 客户端和 COM 服务器)
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguidnf/html/cpconcominteropsamplenetclientcomserver.asp

标签: C#, COM

工具

cnBeta.COM_cnBeta 博文精选_ 11款完全免费的Web设计工具
http://www.cnbeta.com/articles/67153.htm

11款完全免费的Web设计工具

ugmbbc发布于 2008-10-15 23:22:23| 次阅读 字体: 打印预览

cnBeta 博文精选感谢Sonny的投递
今天,我将列举11款完全免费并且很有用的基于Web的设计工具,其中的多数可能不是很有名,但是肯定会让你眼睛一亮!
下面就来看看他们吧,如果您了解多正在使用更多更好的Web设计工具,欢迎分享。
1. splashup

splashup 是一款功能强大的图片编辑和管理软件,它基本上具有了所有菜鸟级和专业级设计者所需要的功能,它的界面非常的人性化,并且提供对多图像编辑的支持,虽然功能不如Photoshop(十大Photoshop教程网站)(25张顶级的Photoshop图片)(22张梦幻派photoshop教程级图片)强大,但也提供了对图层,滤镜,选取的支持.如果您要使用splashuo,需要拥有他的账户。
2. ResizR

ResizR 是一款漂亮,免费并且很有用的小助手,它允许你自由的缩放本地硬盘或Web上的图片,不过目前只支持JPG格式的图片,由于ResizR 每隔 60 分钟会清除之前操作过的图片, 所以不用担心版权问题! 此外ResizR 的网站上还提供了用于Firefox的扩展(13个网页设计必备的Firefox扩展).
3. Adhesiontext

Adhesiontext, 一款动态的文本工具, 它能够提供不同语言字符集中同一字符串的不同样式, 对于处于开发早期的字体设计和开发者来说尤其有用. 目前支持的语种有: 英语,法语,德语,西班牙语,葡萄牙语,加泰罗尼亚语,荷兰语。
4. CSS Layout Generator

CSS Layout Generator(7个最好的网上CSS资源) 能够在您设定参数的情况下, 生成浮动宽度或者固定宽度的流体布局, 可以有三栏式的, 也可以具有头部[Header]或脚部[Footer], 各栏的宽度可以以多种尺度来衡量, 例如像素[px],等宽字体宽度[em],百分比[%]等. 此外,你你还可以选择生成文档的Doctype属性, 是HTML或者XHTML。
5. PatternCooler

把您自己的色彩添加到复古和当代的设计样式中, 或者浏览数以千计的预定义样式, 该网站上的所有艺术作品可以在个人博客, 手机壁纸, MySpace的简介和非商业网站项目中免费使用!
6. ThinkFree

ThinkFree, 在线的Office, 允许您快速的查看, 组织, 编辑, 管理以及共享文档, 于Google的Docs服务颇有几分相似。
7. ColorSchemer ColorPix

一款小巧的Color Picker, 能够随着您鼠标的移动迅速的抓取屏幕颜色, 并将其转换为不同格式的颜色标识, 其优点是无需安装, 只需下载直接运行, 使用时, 可以设定不同的缩放程度, 一边夺取等精确的颜色信息, 合适的时候, 单击就可以把当前颜色代码复制到剪贴板, 此外, 改程序可以被设定为”置顶”,位于所有程序的窗口的上方。
8. Net2ftp

基于Web的FTP客户端, 仅仅利用浏览器就可以轻松的管理您的网站, 特别适用于那些服务器托管的网站管理员, 使用它可以随意的编辑代码, 上传/下载文件, 拷贝/移动/删除/重命名 文件或者目录。
9. Remember The Milk

直观的界面来帮助您管理日常事物, 就如Google Calendar, 可以随意安排日程, 众多的快捷键, 收到Gmail,SMS,或其他即时信息的提醒, 如发送邮件般简单的任务添加, 会给您空前的体验。
10. Picreflect

Picreflect 快速的生成图片倒影, 缩放图片, 或者任意角度的旋转。

11. Colors on the Web

专心于颜色的设计理论, 尤其是Web设计和应用, 让Web Designers(16个优秀网站教你网站设计) 更好的理解颜色的重要性, 更容易的学习颜色理论, 此外还提供了几款常用的颜色工具, 如 Color Wizard, Color Wheel, 和Contrast Analyzer.

标签:

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Connecting to %s


加关注

Get every new post delivered to your Inbox.