﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-C++ Programmer's Cookbook-随笔分类-C#/.NET</title><link>http://www.cppblog.com/mzty/category/286.html</link><description>&lt;a href = "http://www.cppblog.com/mzty/archive/2007/03/02/19109.html"&gt;&lt;font size = 3 &gt;{C++ 基础}&lt;font/&gt;&lt;/a&gt;

&lt;a href = "http://www.cppblog.com/mzty/archive/2007/08/13/29922.html"&gt;&lt;font size = 3 &gt;{C++ 高级}&lt;font/&gt;&lt;/a&gt;

&lt;a href = "http://www.cppblog.com/mzty/archive/2007/04/16/22064.html"&gt;&lt;font size = 3 &gt;{C#界面，C++核心算法}&lt;font/&gt;&lt;/a&gt;

&lt;a href = "http://www.cppblog.com/mzty/archive/2007/03/04/19163.html"&gt;&lt;font size = 3 &gt;{设计模式}&lt;font/&gt;&lt;/a&gt;

&lt;a href = "
http://www.cppblog.com/mzty/archive/2007/03/04/19167.html"&gt;&lt;font size = 3 &gt;{C#基础}&lt;font/&gt;&lt;/a&gt;





</description><language>zh-cn</language><lastBuildDate>Wed, 12 Jan 2011 17:40:39 GMT</lastBuildDate><pubDate>Wed, 12 Jan 2011 17:40:39 GMT</pubDate><ttl>60</ttl><item><title>csharp中xml引用xslt</title><link>http://www.cppblog.com/mzty/archive/2011/01/12/138409.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Wed, 12 Jan 2011 12:58:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2011/01/12/138409.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/138409.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2011/01/12/138409.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/138409.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/138409.html</trackback:ping><description><![CDATA[使用xmldocument.createprocessinginstruction()方法。 <br><br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;System;<br></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;System.IO;<br></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;System.Xml;<br><br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Sample<br>{<br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Main()<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;XmlDocument&nbsp;doc&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;XmlDocument();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Create&nbsp;a&nbsp;procesing&nbsp;instruction.</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;XmlProcessingInstruction&nbsp;newPI;<br>&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;PItext&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">type='text/xsl'&nbsp;href='book.xsl'</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;newPI&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;doc.CreateProcessingInstruction(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">xml-stylesheet</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;PItext);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Display&nbsp;the&nbsp;target&nbsp;and&nbsp;data&nbsp;information.</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;?{0}&nbsp;{1}?&gt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;newPI.Target,&nbsp;newPI.Data);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Add&nbsp;the&nbsp;processing&nbsp;instruction&nbsp;node&nbsp;to&nbsp;the&nbsp;document.</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;doc.AppendChild(newPI);<br><br>&nbsp;&nbsp;}<br>}</span></div>
<br>完！<img src ="http://www.cppblog.com/mzty/aggbug/138409.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2011-01-12 20:58 <a href="http://www.cppblog.com/mzty/archive/2011/01/12/138409.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C#入门代码 </title><link>http://www.cppblog.com/mzty/archive/2008/06/18/53835.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Wed, 18 Jun 2008 04:08:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2008/06/18/53835.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/53835.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2008/06/18/53835.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/53835.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/53835.html</trackback:ping><description><![CDATA[<div class=postbody>
<p>转自：<a href="http://www.cnblogs.com/lyj/archive/2007/01/09/616053.html">http://www.cnblogs.com/lyj/archive/2007/01/09/616053.html</a><br><strong><br>一、从控制台读取东西代码片断：</strong><br>using System;</p>
<p>class TestReadConsole<br>{<br>&nbsp;&nbsp;&nbsp; public static void Main()<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.Write(Enter your name:);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string strName = Console.ReadLine();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine( Hi + strName);<br>&nbsp;&nbsp;&nbsp; }<br>}<br><strong>二、读文件代码片断：</strong><br>using System; <br>using System.IO; </p>
<p>public class TestReadFile <br>{ <br>&nbsp;&nbsp;&nbsp; public static void Main(String[] args) <br>&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Read text file C:\temp\test.txt <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileStream fs = new FileStream(@c:\temp\test.txt , FileMode.Open, FileAccess.Read); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StreamReader sr = new StreamReader(fs);&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String line=sr.ReadLine();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (line!=null)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(line);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line=sr.ReadLine();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sr.Close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fs.Close();<br>&nbsp;&nbsp;&nbsp; } <br>} <br><strong>三、写文件代码：<br></strong>using System; <br>using System.IO; </p>
<p>public class TestWriteFile <br>{ <br>&nbsp;&nbsp;&nbsp; public static void Main(String[] args) <br>&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Create a text file C:\temp\test.txt <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileStream fs = new FileStream(@c:\temp\test.txt , FileMode.OpenOrCreate, FileAccess.Write); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StreamWriter sw = new StreamWriter(fs); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Write to the file using StreamWriter class <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sw.BaseStream.Seek(0, SeekOrigin.End); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sw.WriteLine( First Line ); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sw.WriteLine( Second Line); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sw.Flush(); <br>&nbsp;&nbsp;&nbsp; } <br>} <br><strong>四、拷贝文件：</strong><br>using System;<br>using System.IO;</p>
<p>class TestCopyFile<br>{<br>&nbsp;&nbsp;&nbsp; public static void Main()<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File.Copy(c:\\temp\\source.txt, C:\\temp\\dest.txt );&nbsp; <br>&nbsp;&nbsp;&nbsp; }<br>}<br><strong>五、移动文件：<br></strong>using System;<br>using System.IO;</p>
<p>class TestMoveFile<br>{<br>&nbsp;&nbsp;&nbsp; public static void Main()<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File.Move(c:\\temp\\abc.txt, C:\\temp\\def.txt );&nbsp; <br>&nbsp;&nbsp;&nbsp; }<br>}<br><strong>六、使用计时器：</strong><br>using System;<br>using System.Timers;</p>
<p>class TestTimer<br>{<br>&nbsp;&nbsp;&nbsp; public static void Main()<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Timer timer = new Timer();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timer.Elapsed += new ElapsedEventHandler( DisplayTimeEvent );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timer.Interval = 1000;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timer.Start();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timer.Enabled = true;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while ( Console.Read() != 'q' )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //-------------<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; public static void DisplayTimeEvent( object source, ElapsedEventArgs e )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.Write(\r{0}, DateTime.Now);<br>&nbsp;&nbsp;&nbsp; }<br>}<br><strong>七、调用外部程序：</strong><br>class Test <br>{ <br>&nbsp;&nbsp;&nbsp; static void Main(string[] args) <br>&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Diagnostics.Process.Start(notepad.exe); <br>&nbsp;&nbsp;&nbsp; } <br>}</p>
<p><span style="COLOR: red">ADO.NET方面的：</span><br><strong>八、连接Access数据库：</strong><br>using System;<br>using System.Data;<br>using System.Data.OleDb;</p>
<p>class TestADO<br>{<br>&nbsp;&nbsp;&nbsp; static void Main(string[] args)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string strDSN = Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\\test.mdb;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string strSQL = SELECT * FROM employees ;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OleDbConnection conn = new OleDbConnection(strDSN);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OleDbCommand cmd = new OleDbCommand( strSQL, conn );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OleDbDataReader reader = null;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn.Open();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reader = cmd.ExecuteReader();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (reader.Read() )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(First Name:{0}, Last Name:{1}, reader[FirstName], reader[LastName]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (Exception e)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(e.Message);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; finally<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn.Close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>} <br><strong>九、连接SQL Server数据库：</strong><br>using System;<br>using System.Data.SqlClient;</p>
<p>public class TestADO<br>{<br>&nbsp;&nbsp;&nbsp; public static void Main()<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlConnection conn = new SqlConnection(Data Source=localhost; Integrated Security=SSPI; Initial Catalog=pubs);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlCommand&nbsp; cmd = new SqlCommand(SELECT * FROM employees, conn);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn.Open();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlDataReader reader = cmd.ExecuteReader();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (reader.Read())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(First Name: {0}, Last Name: {1}, reader.GetString(0), reader.GetString(1));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reader.Close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn.Close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(Exception e)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(Exception Occured --&gt;&gt; {0},e);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; }<br>}<br><strong>十、从SQL内读数据到XML：<br></strong>using System;<br>using System.Data;<br>using System.Xml;<br>using System.Data.SqlClient; <br>using System.IO; </p>
<p>public class TestWriteXML<br>{ <br>&nbsp;&nbsp;&nbsp; public static void Main()<br>&nbsp;&nbsp;&nbsp; { </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String strFileName=c:/temp/output.xml;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlConnection conn = new SqlConnection(server=localhost;uid=sa;pwd=;database=db);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String strSql = SELECT FirstName, LastName FROM employees; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlDataAdapter adapter = new SqlDataAdapter(); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; adapter.SelectCommand = new SqlCommand(strSql,conn);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Build the DataSet<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DataSet ds = new DataSet();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; adapter.Fill(ds, employees);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Get a FileStream object<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileStream fs = new FileStream(strFileName,FileMode.OpenOrCreate,FileAccess.Write);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Apply the WriteXml method to write an XML document<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ds.WriteXml(fs);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fs.Close();</p>
<p>&nbsp;&nbsp;&nbsp; }<br>}<br><strong>十一、用ADO添加数据到数据库中：<br></strong>using System;<br>using System.Data;&nbsp;&nbsp; <br>using System.Data.OleDb;&nbsp;&nbsp; </p>
<p>class TestADO<br>{&nbsp; <br>&nbsp;&nbsp;&nbsp; static void Main(string[] args)&nbsp; <br>&nbsp;&nbsp;&nbsp; {&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string strDSN = Provider=Microsoft.Jet.OLEDB.4.0;DataSource=c:\test.mdb;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string strSQL = INSERT INTO Employee(FirstName, LastName) VALUES('FirstName', 'LastName') ;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // create Objects of ADOConnection and ADOCommand&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OleDbConnection conn = new OleDbConnection(strDSN);&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OleDbCommand cmd = new OleDbCommand( strSQL, conn );&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn.Open();&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmd.ExecuteNonQuery();&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (Exception e)&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(Oooops. I did it again:\n{0}, e.Message);&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; finally&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn.Close();&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; } <br>}&nbsp; <br><strong>十二、使用OLEConn连接数据库：</strong><br>using System;<br>using System.Data;&nbsp;&nbsp; <br>using System.Data.OleDb;&nbsp;&nbsp; </p>
<p>class TestADO<br>{&nbsp; <br>&nbsp;&nbsp;&nbsp; static void Main(string[] args)&nbsp; <br>&nbsp;&nbsp;&nbsp; {&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string strDSN = Provider=Microsoft.Jet.OLEDB.4.0;DataSource=c:\test.mdb;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string strSQL = SELECT * FROM employee ;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OleDbConnection conn = new OleDbConnection(strDSN);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OleDbDataAdapter cmd = new OleDbDataAdapter( strSQL, conn ); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn.Open();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DataSet ds = new DataSet();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmd.Fill( ds, employee );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DataTable dt = ds.Tables[0];</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach( DataRow dr in dt.Rows )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(First name: + dr[FirstName].ToString() + Last name: + dr[LastName].ToString());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn.Close();&nbsp; <br>&nbsp;&nbsp;&nbsp; } <br>}&nbsp; <br><strong>十三、读取表的属性：</strong><br>using System;<br>using System.Data;&nbsp;&nbsp; <br>using System.Data.OleDb;&nbsp;&nbsp; </p>
<p>class TestADO<br>{&nbsp; <br>&nbsp;&nbsp;&nbsp; static void Main(string[] args)&nbsp; <br>&nbsp;&nbsp;&nbsp; {&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string strDSN = Provider=Microsoft.Jet.OLEDB.4.0;DataSource=c:\test.mdb;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string strSQL = SELECT * FROM employee ;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OleDbConnection conn = new OleDbConnection(strDSN);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OleDbDataAdapter cmd = new OleDbDataAdapter( strSQL, conn ); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn.Open();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DataSet ds = new DataSet();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmd.Fill( ds, employee );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DataTable dt = ds.Tables[0];</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(Field Name DataType Unique AutoIncrement AllowNull);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(==================================================================);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach( DataColumn dc in dt.Columns )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(dc.ColumnName+ , +dc.DataType + ,+dc.Unique + ,+dc.AutoIncrement+ ,+dc.AllowDBNull );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn.Close();&nbsp; <br>&nbsp;&nbsp;&nbsp; } <br>} </p>
<p><span style="COLOR: red">ASP.NET方面的</span><br><strong>十四、一个ASP.NET程序：</strong><br>&lt;%@ Page Language=C# %&gt;<br>&lt;script runat=server&gt;<br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; void Button1_Click(Object sender, EventArgs e) <br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Label1.Text=TextBox1.Text;<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&lt;/script&gt;<br>&lt;html&gt;<br>&lt;head&gt;<br>&lt;/head&gt;<br>&lt;body&gt;<br>&nbsp;&nbsp;&nbsp; &lt;form runat=server&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;p&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;br /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Enter your name: &lt;asp:TextBox id=TextBox1 runat=server&gt;&lt;/asp:TextBox&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/p&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;p&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;b&gt;&lt;asp:Label id=Label1 runat=server Width=247px&gt;&lt;/asp:Label&gt;&lt;/b&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/p&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;p&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;asp:Button id=Button1 onclick=Button1_Click runat=server Text=Submit&gt;&lt;/asp:Button&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/p&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/form&gt;<br>&lt;/body&gt;<br>&lt;/html&gt;</p>
<p><span style="COLOR: red">WinForm开发：<br></span><strong>十五、一个简单的WinForm程序：</strong><br>using System;<br>using System.Drawing;<br>using System.Collections;<br>using System.ComponentModel;<br>using System.Windows.Forms;<br>using System.Data;</p>
<p><br>public class SimpleForm : System.Windows.Forms.Form<br>{</p>
<p>&nbsp;&nbsp;&nbsp; private System.ComponentModel.Container components = null;<br>&nbsp;&nbsp;&nbsp; private System.Windows.Forms.Button button1;<br>&nbsp;&nbsp;&nbsp; private System.Windows.Forms.TextBox textBox1;<br>&nbsp;&nbsp;&nbsp; public SimpleForm()<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InitializeComponent();<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; protected override void Dispose( bool disposing )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( disposing )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (components != null)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; components.Dispose();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; base.Dispose( disposing );<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; #region Windows Form Designer generated code<br>&nbsp;&nbsp;&nbsp; private void InitializeComponent()<br>&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.components = new System.ComponentModel.Container();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.Size = new System.Drawing.Size(300,300);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.Text = Form1;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.button1 = new System.Windows.Forms.Button();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.textBox1 = new System.Windows.Forms.TextBox();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.SuspendLayout(); <br>&nbsp;&nbsp;&nbsp; //<br>&nbsp;&nbsp;&nbsp; // button1<br>&nbsp;&nbsp;&nbsp; //</p>
<p>&nbsp;&nbsp;&nbsp; this.button1.Location = new System.Drawing.Point(8, 16);<br>&nbsp;&nbsp;&nbsp; this.button1.Name = button1;<br>&nbsp;&nbsp;&nbsp; this.button1.Size = new System.Drawing.Size(80, 24);<br>&nbsp;&nbsp;&nbsp; this.button1.TabIndex = 0;<br>&nbsp;&nbsp;&nbsp; this.button1.Text = button1;</p>
<p>&nbsp;&nbsp;&nbsp; //<br>&nbsp;&nbsp;&nbsp; // textBox1<br>&nbsp;&nbsp;&nbsp; //<br>&nbsp;&nbsp;&nbsp; this.textBox1.Location = new System.Drawing.Point(112, 16);<br>&nbsp;&nbsp;&nbsp; this.textBox1.Name = textBox1;<br>&nbsp;&nbsp;&nbsp; this.textBox1.Size = new System.Drawing.Size(160, 20);<br>&nbsp;&nbsp;&nbsp; this.textBox1.TabIndex = 1;<br>&nbsp;&nbsp;&nbsp; this.textBox1.Text = textBox1;<br>&nbsp;&nbsp;&nbsp; //<br>&nbsp;&nbsp;&nbsp; // Form1<br>&nbsp;&nbsp;&nbsp; //</p>
<p>&nbsp;&nbsp;&nbsp; this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);<br>&nbsp;&nbsp;&nbsp; this.ClientSize = new System.Drawing.Size(292, 273);<br>&nbsp;&nbsp;&nbsp; this.Controls.AddRange(new System.Windows.Forms.Control[] {<br>&nbsp;&nbsp;&nbsp; this.textBox1,<br>&nbsp;&nbsp;&nbsp; this.button1});<br>&nbsp;&nbsp;&nbsp; this.Name = Form1;<br>&nbsp;&nbsp;&nbsp; this.Text = Form1;<br>&nbsp;&nbsp;&nbsp; this.ResumeLayout(false); </p>
<p>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; #endregion</p>
<p>&nbsp;&nbsp;&nbsp; [STAThread]<br>&nbsp;&nbsp;&nbsp; static void Main()<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Application.Run(new SimpleForm());<br>&nbsp;&nbsp;&nbsp; } <br>}<br><strong>十六、运行时显示自己定义的图标：</strong><br>//load icon and set to form<br>System.Drawing.Icon ico = new System.Drawing.Icon(@c:\temp\app.ico);<br>this.Icon = ico;<br><strong>十七、添加组件到ListBox中：</strong><br>private void Form1_Load(object sender, System.EventArgs e)<br>{<br>&nbsp;&nbsp;&nbsp; string str = First item;<br>&nbsp;&nbsp;&nbsp; int i = 23;<br>&nbsp;&nbsp;&nbsp; float flt = 34.98f; <br>&nbsp;&nbsp;&nbsp; listBox1.Items.Add(str);<br>&nbsp;&nbsp;&nbsp; listBox1.Items.Add(i.ToString());<br>&nbsp;&nbsp;&nbsp; listBox1.Items.Add(flt.ToString());<br>&nbsp;&nbsp;&nbsp; listBox1.Items.Add(Last Item in the List Box);<br>} </p>
<p><span style="COLOR: red">网络方面的：</span><br><strong>十八、取得IP地址：</strong><br>using System;<br>using System.Net;</p>
<p>class GetIP<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp; public static void Main()<br>&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPHostEntry ipEntry = Dns.GetHostByName (localhost);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPAddress [] IpAddr = ipEntry.AddressList;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; IpAddr.Length; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine (IP Address {0}: {1} , i, IpAddr.ToString ());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>}<br><strong>十九、取得机器名称：</strong><br>using System;<br>using System.Net;</p>
<p>class GetIP<br>{<br>&nbsp;&nbsp;&nbsp; public static void Main()<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine (Host name : {0}, Dns.GetHostName());<br>&nbsp;&nbsp;&nbsp; }<br>}<br><strong>二十、发送邮件：</strong><br>using System;<br>using System.Web;<br>using System.Web.Mail;</p>
<p>public class TestSendMail<br>{<br>&nbsp;&nbsp;&nbsp; public static void Main()<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // <span>Construct a new mail message <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MailMessage message = new MailMessage();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message.From = <font color=#000080>from@domain.com</font>;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message.To&nbsp;&nbsp; =&nbsp; <span style="COLOR: #000000"><font color=#000080>pengyun@cobainsoft.com</font>;</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message.Cc&nbsp;&nbsp; = ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message.Bcc&nbsp; = ;</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message.Subject = Subject;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message.Body = Content of message;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //if you want attach file with this mail, add the line below<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message.Attachments.Add(new MailAttachment(c:\\attach.txt, MailEncoding.Base64));<br>&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Send the message<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SmtpMail.Send(message);&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Console.WriteLine(Message has been sent);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(Exception ex)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Console.WriteLine(ex.Message.ToString());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; }<br>}<br><strong>二十一、根据IP地址得出机器名称：</strong><br>using System;<br>using System.Net;</p>
<p>class ResolveIP<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp; public static void Main()<br>&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPHostEntry ipEntry = Dns.Resolve(172.29.9.9);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine (Host name : {0}, ipEntry.HostName);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>}</p>
<p><span style="COLOR: #ff0000">GDI+方面的：</span><br><strong>二十二、GDI+入门介绍：</strong><br>using System;<br>using System.Drawing;<br>using System.Collections;<br>using System.ComponentModel;<br>using System.Windows.Forms;<br>using System.Data;</p>
<p>public class Form1 : System.Windows.Forms.Form<br>{<br>&nbsp;&nbsp;&nbsp; private System.ComponentModel.Container components = null;</p>
<p>&nbsp;&nbsp;&nbsp; public Form1()<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InitializeComponent();<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; protected override void Dispose( bool disposing )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( disposing )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (components != null) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; components.Dispose();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; base.Dispose( disposing );<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; #region Windows Form Designer generated code<br>&nbsp;&nbsp;&nbsp; private void InitializeComponent()<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.ClientSize = new System.Drawing.Size(292, 273);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.Name = Form1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.Text = Form1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; #endregion</p>
<p>&nbsp;&nbsp;&nbsp; [STAThread]<br>&nbsp;&nbsp;&nbsp; static void Main() <br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Application.Run(new Form1());<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Graphics g=e.Graphics;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g.DrawLine(new Pen(Color.Blue),10,10,210,110);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g.DrawRectangle(new Pen(Color.Red),10,10,200,100);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g.DrawEllipse(new Pen(Color.Yellow),10,150,200,100);<br>&nbsp;&nbsp;&nbsp; }<br>}</p>
<p><span style="COLOR: #ff0000">XML方面的：<br></span><strong>二十三、读取XML文件：</strong><br>using System;<br>using System.Xml;&nbsp; </p>
<p>class TestReadXML<br>{<br>&nbsp;&nbsp;&nbsp; public static void Main()<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XmlTextReader reader&nbsp; = new XmlTextReader(C:\\test.xml);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reader.Read();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (reader.Read())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reader.MoveToElement();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(XmlTextReader Properties Test);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(===================);&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Read this properties of element and display them on console<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(Name: + reader.Name);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(Base URI: + reader.BaseURI);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(Local Name: + reader.LocalName);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(Attribute Count: + reader.AttributeCount.ToString());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(Depth: + reader.Depth.ToString());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(Line Number: + reader.LineNumber.ToString());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(Node Type: + reader.NodeType.ToString());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(Attribute Count: + reader.Value.ToString());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>} <br><strong>二十四、写XML文件：</strong><br>using System; <br>using System.Xml; </p>
<p>public class TestWriteXMLFile <br>{ <br>&nbsp;&nbsp;&nbsp; public static int Main(string[] args) <br>&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Creates an XML file is not exist <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XmlTextWriter writer = new XmlTextWriter(C:\\temp\\xmltest.xml, null); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Starts a new document <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.WriteStartDocument(); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Write comments <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.WriteComment(Commentss: XmlWriter Test Program); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.WriteProcessingInstruction(Instruction,Person Record); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Add elements to the file <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.WriteStartElement(p, person, urn:person); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.WriteStartElement(LastName,); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.WriteString(Chand); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.WriteEndElement(); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.WriteStartElement(FirstName,); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.WriteString(Mahesh); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.WriteEndElement(); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.WriteElementInt16(age,, 25); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Ends the document <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.WriteEndDocument(); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (Exception e) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine (Exception: {0}, e.ToString()); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0; <br>&nbsp;&nbsp;&nbsp; } <br>} </p>
<p><span style="COLOR: #ff0000">Web Service方面的：</span><br><strong>二十五、一个Web Service的小例子：<br></strong>&lt;% @WebService Language=C# Class=TestWS %&gt;</p>
<p>using System.Web.Services;</p>
<p>public class TestWS : System.Web.Services.WebService<br>{<br>&nbsp;&nbsp;&nbsp; [WebMethod()]<br>&nbsp;&nbsp;&nbsp; public string StringFromWebService()<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return This is a string from web service.;<br>&nbsp;&nbsp;&nbsp; }<br>} </p>
</div><img src ="http://www.cppblog.com/mzty/aggbug/53835.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2008-06-18 12:08 <a href="http://www.cppblog.com/mzty/archive/2008/06/18/53835.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>本博客所有精华随笔索引</title><link>http://www.cppblog.com/mzty/archive/2008/01/17/41318.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Thu, 17 Jan 2008 02:14:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2008/01/17/41318.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/41318.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2008/01/17/41318.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/41318.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/41318.html</trackback:ping><description><![CDATA[<p><br>总结：<a href="http://www.cppblog.com/mzty/archive/2007/08/13/29922.html"><br><br>http://www.cppblog.com/mzty/archive/2007/08/13/29922.html</a>&nbsp; C++高级</p>
<p><a href="http://www.cppblog.com/mzty/archive/2007/03/02/19109.html">http://www.cppblog.com/mzty/archive/2007/03/02/19109.html</a>&nbsp; C++基础</p>
<p><a href="http://www.cppblog.com/mzty/archive/2007/04/16/22064.html">http://www.cppblog.com/mzty/archive/2007/04/16/22064.html</a>&nbsp; C#界面，C++核心算法</p>
<p><a href="http://www.cppblog.com/mzty/archive/2007/03/04/19163.html">http://www.cppblog.com/mzty/archive/2007/03/04/19163.html</a>&nbsp; 设计模式</p>
<p><a href="http://www.cppblog.com/mzty/archive/2007/03/29/20893.html">http://www.cppblog.com/mzty/archive/2007/03/29/20893.html</a>&nbsp; 64bit，FW3.0随笔分类 </p>
<p><a href="http://www.cppblog.com/mzty/archive/2007/03/29/20892.html">http://www.cppblog.com/mzty/archive/2007/03/29/20892.html</a>&nbsp; windows脚本技术</p>
<p><a href="http://www.cppblog.com/mzty/archive/2007/03/04/19167.html">http://www.cppblog.com/mzty/archive/2007/03/04/19167.html</a>&nbsp; C#基础</p><img src ="http://www.cppblog.com/mzty/aggbug/41318.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2008-01-17 10:14 <a href="http://www.cppblog.com/mzty/archive/2008/01/17/41318.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C#的Form通过CLI调用C++的DLL</title><link>http://www.cppblog.com/mzty/archive/2007/12/25/39610.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Tue, 25 Dec 2007 11:14:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2007/12/25/39610.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/39610.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2007/12/25/39610.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/39610.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/39610.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一 方法&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C#的project调用C++的DLL，一般也有3中方法：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1）最简单的方法，通过PInvoke，但是只能调用全局function，不能调用Class。&nbsp;&nbsp;&...&nbsp;&nbsp;<a href='http://www.cppblog.com/mzty/archive/2007/12/25/39610.html'>阅读全文</a><img src ="http://www.cppblog.com/mzty/aggbug/39610.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2007-12-25 19:14 <a href="http://www.cppblog.com/mzty/archive/2007/12/25/39610.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>NativeC++通过CLI调用C#的Form</title><link>http://www.cppblog.com/mzty/archive/2007/12/25/39555.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Tue, 25 Dec 2007 02:51:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2007/12/25/39555.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/39555.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2007/12/25/39555.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/39555.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/39555.html</trackback:ping><description><![CDATA[<br>一 调用方法<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Native C++的project调用C#的DLL，一般有3中方法：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1）通过COM封装<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2）通过CLI/C++的Wrapper<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3)&nbsp; 在VS中可以直接修改NativeC++的project或是部分文件为使用CLR来调用C#的DLL<br><br>二 实例<br>1）C#的一个MyForm类，有public函数ShowMyForm（）<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;System;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;System.Collections.Generic;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;System.Text;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;System.Windows.Forms;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;CsharpDLL<br><img id=Codehighlighter1_116_1454_Open_Image onclick="this.style.display='none'; Codehighlighter1_116_1454_Open_Text.style.display='none'; Codehighlighter1_116_1454_Closed_Image.style.display='inline'; Codehighlighter1_116_1454_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_116_1454_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_116_1454_Closed_Text.style.display='none'; Codehighlighter1_116_1454_Open_Image.style.display='inline'; Codehighlighter1_116_1454_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_116_1454_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_116_1454_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;MyForm&nbsp;:&nbsp;Form<br><img id=Codehighlighter1_153_1452_Open_Image onclick="this.style.display='none'; Codehighlighter1_153_1452_Open_Text.style.display='none'; Codehighlighter1_153_1452_Closed_Image.style.display='inline'; Codehighlighter1_153_1452_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_153_1452_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_153_1452_Closed_Text.style.display='none'; Codehighlighter1_153_1452_Open_Image.style.display='inline'; Codehighlighter1_153_1452_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_153_1452_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_153_1452_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;Button&nbsp;button1;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;ShowMyForm()<br><img id=Codehighlighter1_229_270_Open_Image onclick="this.style.display='none'; Codehighlighter1_229_270_Open_Text.style.display='none'; Codehighlighter1_229_270_Closed_Image.style.display='inline'; Codehighlighter1_229_270_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_229_270_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_229_270_Closed_Text.style.display='none'; Codehighlighter1_229_270_Open_Image.style.display='inline'; Codehighlighter1_229_270_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_229_270_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_229_270_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.ShowDialog();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;MyForm()<br><img id=Codehighlighter1_304_448_Open_Image onclick="this.style.display='none'; Codehighlighter1_304_448_Open_Text.style.display='none'; Codehighlighter1_304_448_Closed_Image.style.display='inline'; Codehighlighter1_304_448_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_304_448_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_304_448_Closed_Text.style.display='none'; Codehighlighter1_304_448_Open_Image.style.display='inline'; Codehighlighter1_304_448_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_304_448_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_304_448_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InitializeComponent();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.Text&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">MyForm</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.StartPosition&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;FormStartPosition.CenterScreen;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;InitializeComponent()<br><img id=Codehighlighter1_501_1303_Open_Image onclick="this.style.display='none'; Codehighlighter1_501_1303_Open_Text.style.display='none'; Codehighlighter1_501_1303_Closed_Image.style.display='inline'; Codehighlighter1_501_1303_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_501_1303_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_501_1303_Closed_Text.style.display='none'; Codehighlighter1_501_1303_Open_Image.style.display='inline'; Codehighlighter1_501_1303_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_501_1303_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_501_1303_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.button1&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;System.Windows.Forms.Button();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.SuspendLayout();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;button1<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.button1.Location&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;System.Drawing.Point(</span><span style="COLOR: #000000">110</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">74</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.button1.Name&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">button1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.button1.Size&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;System.Drawing.Size(</span><span style="COLOR: #000000">75</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">23</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.button1.TabIndex&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.button1.Text&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">TestMessageBox</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.button1.UseVisualStyleBackColor&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.button1.Click&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;System.EventHandler(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.button1_Click);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;MyForm<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.ClientSize&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;System.Drawing.Size(</span><span style="COLOR: #000000">292</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">266</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.Controls.Add(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.button1);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.Name&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">MyForm</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.ResumeLayout(</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;button1_Click(</span><span style="COLOR: #0000ff">object</span><span style="COLOR: #000000">&nbsp;sender,&nbsp;EventArgs&nbsp;e)<br><img id=Codehighlighter1_1377_1446_Open_Image onclick="this.style.display='none'; Codehighlighter1_1377_1446_Open_Text.style.display='none'; Codehighlighter1_1377_1446_Closed_Image.style.display='inline'; Codehighlighter1_1377_1446_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1377_1446_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1377_1446_Closed_Text.style.display='none'; Codehighlighter1_1377_1446_Open_Image.style.display='inline'; Codehighlighter1_1377_1446_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_1377_1446_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_1377_1446_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox.Show(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Hello,&nbsp;i&nbsp;am&nbsp;a&nbsp;Csharp&nbsp;Form!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<br>2）C#的exe调用<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;System;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;System.Collections.Generic;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;System.Text;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;CsharpTest<br><img id=Codehighlighter1_89_411_Open_Image onclick="this.style.display='none'; Codehighlighter1_89_411_Open_Text.style.display='none'; Codehighlighter1_89_411_Closed_Image.style.display='inline'; Codehighlighter1_89_411_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_89_411_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_89_411_Closed_Text.style.display='none'; Codehighlighter1_89_411_Open_Image.style.display='inline'; Codehighlighter1_89_411_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_89_411_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_89_411_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Program<br><img id=Codehighlighter1_113_409_Open_Image onclick="this.style.display='none'; Codehighlighter1_113_409_Open_Text.style.display='none'; Codehighlighter1_113_409_Closed_Image.style.display='inline'; Codehighlighter1_113_409_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_113_409_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_113_409_Closed_Text.style.display='none'; Codehighlighter1_113_409_Open_Image.style.display='inline'; Codehighlighter1_113_409_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_113_409_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_113_409_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Main(</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">[]&nbsp;args)<br><img id=Codehighlighter1_163_403_Open_Image onclick="this.style.display='none'; Codehighlighter1_163_403_Open_Text.style.display='none'; Codehighlighter1_163_403_Closed_Image.style.display='inline'; Codehighlighter1_163_403_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_163_403_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_163_403_Closed_Text.style.display='none'; Codehighlighter1_163_403_Open_Image.style.display='inline'; Codehighlighter1_163_403_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_163_403_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_163_403_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.Console.WriteLine(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Csharp&nbsp;main&nbsp;funtion&nbsp;start:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CsharpDLL.MyForm&nbsp;myForm&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;CsharpDLL.MyForm();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myForm.ShowMyForm();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.Console.WriteLine(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Csharp&nbsp;main&nbsp;function&nbsp;end!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<br>3）CLI/C++的warpper，DLLexport函数CallCsharpForm（），此函数中调用C#的MyForm<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">CPPCLIPROXYDLLFORCSHARPDLL_API&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;CallCsharpForm();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#</span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">../debug/CsharpDll.dll</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>CPPCLIPROXYDLLFORCSHARPDLL_API&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;CallCsharpForm()<br><img id=Codehighlighter1_141_222_Open_Image onclick="this.style.display='none'; Codehighlighter1_141_222_Open_Text.style.display='none'; Codehighlighter1_141_222_Closed_Image.style.display='inline'; Codehighlighter1_141_222_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_141_222_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_141_222_Closed_Text.style.display='none'; Codehighlighter1_141_222_Open_Image.style.display='inline'; Codehighlighter1_141_222_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_141_222_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_141_222_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;CsharpDLL::MyForm</span><span style="COLOR: #000000">^</span><span style="COLOR: #000000">&nbsp;myForm&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;gcnew&nbsp;CsharpDLL::MyForm();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;myForm</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">ShowMyForm();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<br>4）NativeC++的exe调用CLI的Wrapper来间接的调用MyForm<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">stdafx.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#pragma&nbsp;comment(lib,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">../debug/CppCLIProxyDLLForCsharpDLL.lib</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;CallCsharpForm();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;_tmain(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;argc,&nbsp;_TCHAR</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;argv[])<br><img id=Codehighlighter1_166_300_Open_Image onclick="this.style.display='none'; Codehighlighter1_166_300_Open_Text.style.display='none'; Codehighlighter1_166_300_Closed_Image.style.display='inline'; Codehighlighter1_166_300_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_166_300_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_166_300_Closed_Text.style.display='none'; Codehighlighter1_166_300_Open_Image.style.display='inline'; Codehighlighter1_166_300_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_166_300_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_166_300_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;std::cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;Cpp&nbsp;Main&nbsp;function&nbsp;start:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">std::endl;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;CallCsharpForm();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;std::cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;Cpp&nbsp;Main&nbsp;function&nbsp;end!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">std::endl;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<br>三 总结<br>要调试最好修改编译选项为Mixed。<br><br>代码下载： <a href="http://www.cppblog.com/Files/mzty/CppCallCsharpByCLI.rar">http://www.cppblog.com/Files/mzty/CppCallCsharpByCLI.rar</a><br><img src ="http://www.cppblog.com/mzty/aggbug/39555.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2007-12-25 10:51 <a href="http://www.cppblog.com/mzty/archive/2007/12/25/39555.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CLI/C++中混合类的使用</title><link>http://www.cppblog.com/mzty/archive/2007/12/24/39517.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Mon, 24 Dec 2007 09:47:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2007/12/24/39517.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/39517.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2007/12/24/39517.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/39517.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/39517.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一 混合类所谓混合类是指CLI/C++中native的Class中可以包含CLR对象，CLR的class也可以包含Naitve的对象。1）native的class中包含CLR对象，必须通过gcroot&lt;&gt;或auto_gcroot&lt;&gt;。2）CLR中的class中包含native的对象，必须是指针，也可以使用高手写的CAutoNativePtr智能指针。注意：C#中不能...&nbsp;&nbsp;<a href='http://www.cppblog.com/mzty/archive/2007/12/24/39517.html'>阅读全文</a><img src ="http://www.cppblog.com/mzty/aggbug/39517.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2007-12-24 17:47 <a href="http://www.cppblog.com/mzty/archive/2007/12/24/39517.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个CLI/C++的DLL同时被C#的exe和NativeC++的exe调用</title><link>http://www.cppblog.com/mzty/archive/2007/12/20/39165.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Thu, 20 Dec 2007 14:47:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2007/12/20/39165.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/39165.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2007/12/20/39165.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/39165.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/39165.html</trackback:ping><description><![CDATA[<br>&nbsp;一&nbsp;引子<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1）使用VS2005，Native C++，C#，CLI/C++。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2）主要介绍CLI/C++和Native C++, C#的交互，最总能够实现以CLI/C++为中介的Native C++与C#的互调。<br><br>&nbsp;二 实例<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1）实现一个CLI/C++的Dll，在此Dll中包含一个RefClass能够被C#的exe调用。（实现过程：在VS中建立C++ CLR Class library 的一个Project，然后增加一个类RefClass）代码如下：<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;refclass.h文件：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#pragma&nbsp;once&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;ClrCppDll&nbsp;<br><img id=Codehighlighter1_36_196_Open_Image onclick="this.style.display='none'; Codehighlighter1_36_196_Open_Text.style.display='none'; Codehighlighter1_36_196_Closed_Image.style.display='inline'; Codehighlighter1_36_196_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_36_196_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_36_196_Closed_Text.style.display='none'; Codehighlighter1_36_196_Open_Image.style.display='inline'; Codehighlighter1_36_196_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_36_196_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_36_196_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">ref</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;RefClass<br><img id=Codehighlighter1_66_193_Open_Image onclick="this.style.display='none'; Codehighlighter1_66_193_Open_Text.style.display='none'; Codehighlighter1_66_193_Closed_Image.style.display='inline'; Codehighlighter1_66_193_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_66_193_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_66_193_Closed_Text.style.display='none'; Codehighlighter1_66_193_Open_Image.style.display='inline'; Codehighlighter1_66_193_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_66_193_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_66_193_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br><img id=Codehighlighter1_89_90_Open_Image onclick="this.style.display='none'; Codehighlighter1_89_90_Open_Text.style.display='none'; Codehighlighter1_89_90_Closed_Image.style.display='inline'; Codehighlighter1_89_90_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_89_90_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_89_90_Closed_Text.style.display='none'; Codehighlighter1_89_90_Open_Image.style.display='inline'; Codehighlighter1_89_90_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RefClass()</span><span id=Codehighlighter1_89_90_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_89_90_Open_Text><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RefClass(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;_x,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;_y)&nbsp;:&nbsp;x(_x),&nbsp;y(_y)<br><img id=Codehighlighter1_136_140_Open_Image onclick="this.style.display='none'; Codehighlighter1_136_140_Open_Text.style.display='none'; Codehighlighter1_136_140_Closed_Image.style.display='inline'; Codehighlighter1_136_140_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_136_140_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_136_140_Closed_Text.style.display='none'; Codehighlighter1_136_140_Open_Image.style.display='inline'; Codehighlighter1_136_140_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_136_140_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_136_140_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;PrintSelf();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;x;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;y;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;refclass.cpp文件：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">stdafx.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">refclass.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;System;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;ClrCppDll;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;RefClass::PrintSelf()<br><img id=Codehighlighter1_122_270_Open_Image onclick="this.style.display='none'; Codehighlighter1_122_270_Open_Text.style.display='none'; Codehighlighter1_122_270_Closed_Image.style.display='inline'; Codehighlighter1_122_270_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_122_270_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_122_270_Closed_Text.style.display='none'; Codehighlighter1_122_270_Open_Image.style.display='inline'; Codehighlighter1_122_270_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_122_270_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_122_270_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;System::Console::WriteLine(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">hello,&nbsp;i&nbsp;am&nbsp;a&nbsp;ref&nbsp;cpp&nbsp;class</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;System::Console::WriteLine(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">x&nbsp;is&nbsp;{0}</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,x);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;System::Console::WriteLine(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">y&nbsp;is&nbsp;{0}</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,y);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2）能够调用上面第1）步中的CLI/C++的Dll中class的C#的exe。（实现过程：在VS建立C#的console Application，然后reference 前面的1)生成的Dll）代码如下：<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Program.cs文件：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;System;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;System.Collections.Generic;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;System.Text;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;CsharpTest<br><img id=Codehighlighter1_89_286_Open_Image onclick="this.style.display='none'; Codehighlighter1_89_286_Open_Text.style.display='none'; Codehighlighter1_89_286_Closed_Image.style.display='inline'; Codehighlighter1_89_286_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_89_286_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_89_286_Closed_Text.style.display='none'; Codehighlighter1_89_286_Open_Image.style.display='inline'; Codehighlighter1_89_286_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_89_286_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_89_286_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Program<br><img id=Codehighlighter1_113_284_Open_Image onclick="this.style.display='none'; Codehighlighter1_113_284_Open_Text.style.display='none'; Codehighlighter1_113_284_Closed_Image.style.display='inline'; Codehighlighter1_113_284_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_113_284_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_113_284_Closed_Text.style.display='none'; Codehighlighter1_113_284_Open_Image.style.display='inline'; Codehighlighter1_113_284_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_113_284_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_113_284_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Main(</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">[]&nbsp;args)<br><img id=Codehighlighter1_163_278_Open_Image onclick="this.style.display='none'; Codehighlighter1_163_278_Open_Text.style.display='none'; Codehighlighter1_163_278_Closed_Image.style.display='inline'; Codehighlighter1_163_278_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_163_278_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_163_278_Closed_Text.style.display='none'; Codehighlighter1_163_278_Open_Image.style.display='inline'; Codehighlighter1_163_278_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_163_278_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_163_278_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ClrCppDll.RefClass&nbsp;refClass&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;ClrCppDll.RefClass(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;refClass.PrintSelf();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<br><span style="BACKGROUND-COLOR: #ff0000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;上面2步的代码下载</span>：<a href="http://www.cppblog.com/Files/mzty/CSharpCPPCLI1.rar">http://www.cppblog.com/Files/mzty/CSharpCPPCLI1.rar</a>&nbsp;（实现CLI/C++的dll能够被C#调用）<br><br><br><br>&nbsp;&nbsp;&nbsp;&nbsp; 3）对1）实现的CLI/C++的Dll中增加能够被Native C++调用的NativeClass。代码如下：<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NativeClass.h文件：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#pragma&nbsp;once<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;ClrCppDll<br><img id=Codehighlighter1_34_207_Open_Image onclick="this.style.display='none'; Codehighlighter1_34_207_Open_Text.style.display='none'; Codehighlighter1_34_207_Closed_Image.style.display='inline'; Codehighlighter1_34_207_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_34_207_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_34_207_Closed_Text.style.display='none'; Codehighlighter1_34_207_Open_Image.style.display='inline'; Codehighlighter1_34_207_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_34_207_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_34_207_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;NativeClass<br><img id=Codehighlighter1_63_204_Open_Image onclick="this.style.display='none'; Codehighlighter1_63_204_Open_Text.style.display='none'; Codehighlighter1_63_204_Closed_Image.style.display='inline'; Codehighlighter1_63_204_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_63_204_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_63_204_Closed_Text.style.display='none'; Codehighlighter1_63_204_Open_Image.style.display='inline'; Codehighlighter1_63_204_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_63_204_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_63_204_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br><img id=Codehighlighter1_93_94_Open_Image onclick="this.style.display='none'; Codehighlighter1_93_94_Open_Text.style.display='none'; Codehighlighter1_93_94_Closed_Image.style.display='inline'; Codehighlighter1_93_94_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_93_94_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_93_94_Closed_Text.style.display='none'; Codehighlighter1_93_94_Open_Image.style.display='inline'; Codehighlighter1_93_94_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NativeClass()</span><span id=Codehighlighter1_93_94_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_93_94_Open_Text><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NativeClass(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;_x,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;_y)&nbsp;:&nbsp;x(_x),&nbsp;y(_y)<br><img id=Codehighlighter1_145_146_Open_Image onclick="this.style.display='none'; Codehighlighter1_145_146_Open_Text.style.display='none'; Codehighlighter1_145_146_Closed_Image.style.display='inline'; Codehighlighter1_145_146_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_145_146_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_145_146_Closed_Text.style.display='none'; Codehighlighter1_145_146_Open_Image.style.display='inline'; Codehighlighter1_145_146_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_145_146_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_145_146_Open_Text><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;printSelf();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;x;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;y;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NativeClass.cpp文件：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">stdafx.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">nativeclass.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;ClrCppDll;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;NativeClass::printSelf()<br><img id=Codehighlighter1_124_257_Open_Image onclick="this.style.display='none'; Codehighlighter1_124_257_Open_Text.style.display='none'; Codehighlighter1_124_257_Closed_Image.style.display='inline'; Codehighlighter1_124_257_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_124_257_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_124_257_Closed_Text.style.display='none'; Codehighlighter1_124_257_Open_Image.style.display='inline'; Codehighlighter1_124_257_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_124_257_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_124_257_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;std::cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">hello,i&nbsp;am&nbsp;a&nbsp;native&nbsp;cpp&nbsp;class!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">std::endl;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;std::cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">x&nbsp;is&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">x</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">std::endl;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;std::cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">y&nbsp;is&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">y</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">std::endl;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="BACKGROUND-COLOR: #ff0000">问题：</span> <span style="COLOR: red">如果我们直接在NativeC++的exe调用上面CLI/C++中的NativeClass，会有问题，Error&nbsp;1&nbsp;error C3381: 'CppClrDll::NativeClass' : assembly access specifiers are only available in code compiled with a /clr option&nbsp;d:\cppandcsharpinteractivetest\csharpcppcli\clrcppdll\nativeclass.h&nbsp;8，这是为什么那，我们想想我们一般的Native C++的DLL的调用，都要将要被调用的Class或funtion导出才可以调用，想到这里我们也对我们的NativeClass进行导出。（怎么导出可以看下面的代码）但是当增加了对NativeClass的导出，调用的时候仍然有上面的error，Error&nbsp;1&nbsp;error C3381: 'CppClrDll::NativeClass' : assembly access specifiers are only available in code compiled with a /clr option&nbsp;d:\cppandcsharpinteractivetest\csharpcppcli\clrcppdll\nativeclass.h&nbsp;9，最后只有查找资料（没有找到）问别人（没有问到），最后想到使用导出函数试试，一试果然可行啊，哈哈哈，so Happy</span>！<span style="COLOR: #00ccff">其实后来发现是我加的导出__declspec(dllexport)的位置不对，应该是在class关键字后面，总之导出类也是可以的。</span>导出类的代码可以下载新的sample，增加导出和导出的函数代码如下：<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (导出不久需要下面的2文件，还的定义宏 CLR_CPP_DLL在编译选项中，或直接写在文件中)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clrcppdll.h<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;ClrCppDll.h</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#pragma&nbsp;once<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#ifdef&nbsp;CLR_CPP_DLL<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;DLLIMPEXP&nbsp;__declspec(dllexport)</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">#else</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;DLLIMPEXP</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">#endif</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;ClrCppDll&nbsp;<br><img id=Codehighlighter1_142_190_Open_Image onclick="this.style.display='none'; Codehighlighter1_142_190_Open_Text.style.display='none'; Codehighlighter1_142_190_Closed_Image.style.display='inline'; Codehighlighter1_142_190_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_142_190_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_142_190_Closed_Text.style.display='none'; Codehighlighter1_142_190_Open_Image.style.display='inline'; Codehighlighter1_142_190_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_142_190_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_142_190_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;DLLIMPEXP&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;&nbsp;CallNativeClassPrintSelf();&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clrcppdll.cpp文件：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;This&nbsp;is&nbsp;the&nbsp;main&nbsp;DLL&nbsp;file.</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">stdafx.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">NativeClass.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ClrCppDll.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>DLLIMPEXP&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;&nbsp;ClrCppDll::CallNativeClassPrintSelf()<br><img id=Codehighlighter1_154_212_Open_Image onclick="this.style.display='none'; Codehighlighter1_154_212_Open_Text.style.display='none'; Codehighlighter1_154_212_Closed_Image.style.display='inline'; Codehighlighter1_154_212_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_154_212_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_154_212_Closed_Text.style.display='none'; Codehighlighter1_154_212_Open_Image.style.display='inline'; Codehighlighter1_154_212_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_154_212_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_154_212_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;ClrCppDll::NativeClass&nbsp;test(</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">20</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;test.printSelf();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4）建立一个NativeC++的exe来调用1）生成的CLI/C++的Dll中的3）增加的NativeClass（实现过程：建立一个Native C++的console application）代码如下：<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cpptest.cpp文件：（经过上一步问题的反复折磨，终于搞定）（同时别忘了要在编译选项中指定lib和lib的路径）<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;CppTest.cpp&nbsp;:&nbsp;Defines&nbsp;the&nbsp;entry&nbsp;point&nbsp;for&nbsp;the&nbsp;console&nbsp;application.<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">stdafx.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">../ClrCppDll/clrcppdll.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;_tmain(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;argc,&nbsp;_TCHAR</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;argv[])<br><img id=Codehighlighter1_168_280_Open_Image onclick="this.style.display='none'; Codehighlighter1_168_280_Open_Text.style.display='none'; Codehighlighter1_168_280_Closed_Image.style.display='inline'; Codehighlighter1_168_280_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_168_280_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_168_280_Closed_Text.style.display='none'; Codehighlighter1_168_280_Open_Image.style.display='inline'; Codehighlighter1_168_280_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_168_280_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_168_280_Open_Text><span style="COLOR: #000000">{<br><img id=Codehighlighter1_171_226_Open_Image onclick="this.style.display='none'; Codehighlighter1_171_226_Open_Text.style.display='none'; Codehighlighter1_171_226_Closed_Image.style.display='inline'; Codehighlighter1_171_226_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_171_226_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_171_226_Closed_Text.style.display='none'; Codehighlighter1_171_226_Open_Image.style.display='inline'; Codehighlighter1_171_226_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_171_226_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id=Codehighlighter1_171_226_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">ClrCppDll::NativeClass&nbsp;test(5,6);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;test.PrintSelf();</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;ClrCppDll::CallNativeClassPrintSelf();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<br><br>&nbsp;&nbsp;&nbsp;上面四步总代码下载：<a href="http://www.cppblog.com/Files/mzty/CSharpCPPCLI2.rar">http://www.cppblog.com/Files/mzty/CSharpCPPCLI2.rar</a>&nbsp;（实现CLI/C++的dll同时被Native C++和C#的调用）<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5）扩展，增加在NativeClass中调用RefClass的funtion, 和RefClass中调用NativeClass的function。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;代码下载：<a href="http://www.cppblog.com/Files/mzty/CSharpCPPCLI3.rar">http://www.cppblog.com/Files/mzty/CSharpCPPCLI3.rar</a>&nbsp;（最后代码下载，包含NativeClass与RefClass的互调）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.cppblog.com/Files/mzty/CSharpCPPCLI32.zip">http://www.cppblog.com/Files/mzty/CSharpCPPCLI32.zip</a>&nbsp;（包含native class的导出也调用）<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;三 总结<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1) CLI/C++中如果想导出让NativeC++使用，则最好导出函数,也可以导出类。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2) CLI/C++的DLL可以没有像一般的NativeC++的Dll中的DllMain（）函数。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3) CLI/C++如果想导出让C#使用，则一般是ref class。<br><br><br><br><br><br><br><br><img src ="http://www.cppblog.com/mzty/aggbug/39165.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2007-12-20 22:47 <a href="http://www.cppblog.com/mzty/archive/2007/12/20/39165.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struct在p/invoke中的转化</title><link>http://www.cppblog.com/mzty/archive/2007/06/04/25531.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Mon, 04 Jun 2007 15:34:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2007/06/04/25531.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/25531.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2007/06/04/25531.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/25531.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/25531.html</trackback:ping><description><![CDATA[<br>在msdn上发现很好的实例，与大家共享！<br><br>enum调用实例：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">//</span><span style="COLOR: #000000">&nbsp;Unions.cs<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>using&nbsp;System;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>using&nbsp;System.Runtime.InteropServices;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">/*</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>union&nbsp;MYUNION<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;d;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>};<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">*/</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>[&nbsp;StructLayout(&nbsp;LayoutKind.Explicit&nbsp;)]<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;struct&nbsp;MyUnion&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;[&nbsp;FieldOffset(&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;)]<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;[&nbsp;FieldOffset(&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;)]<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;d;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>}<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">/*</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>union&nbsp;MYUNION2<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;str[</span><span style="COLOR: #000000">128</span><span style="COLOR: #000000">];<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>};<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">*/</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>[&nbsp;StructLayout(&nbsp;LayoutKind.Explicit,&nbsp;Size</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">128</span><span style="COLOR: #000000">&nbsp;)]<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;struct&nbsp;MyUnion2_1&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>{&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;[&nbsp;FieldOffset(&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;)]<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>}<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>[&nbsp;StructLayout(&nbsp;LayoutKind.Sequential&nbsp;)]<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;struct&nbsp;MyUnion2_2&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>{&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;[&nbsp;MarshalAs(&nbsp;UnmanagedType.ByValTStr,&nbsp;SizeConst</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">128</span><span style="COLOR: #000000">&nbsp;)]&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">String</span><span style="COLOR: #000000">&nbsp;str;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>}<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;class&nbsp;LibWrap<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">//</span><span style="COLOR: #000000">&nbsp;void&nbsp;TestUnion(MYUNION&nbsp;u,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;type)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;[&nbsp;DllImport(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">..\\LIB\\PinvokeLib.dll</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;)]<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;static&nbsp;extern&nbsp;void&nbsp;TestUnion(&nbsp;MyUnion&nbsp;u,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;type&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">//</span><span style="COLOR: #000000">&nbsp;void&nbsp;TestUnion(&nbsp;MYUNION&nbsp;u,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;type&nbsp;)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;[&nbsp;DllImport(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">..\\LIB\\PinvokeLib.dll</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;)]<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;static&nbsp;extern&nbsp;void&nbsp;TestUnion2(&nbsp;MyUnion2_1&nbsp;u,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;type&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">//</span><span style="COLOR: #000000">&nbsp;void&nbsp;TestUnion(MYUNION&nbsp;u,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;type)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;[&nbsp;DllImport(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">..\\LIB\\PinvokeLib.dll</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;)]<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;static&nbsp;extern&nbsp;void&nbsp;TestUnion2(&nbsp;MyUnion2_2&nbsp;u,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;type&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>}<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;class&nbsp;App<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;static&nbsp;void&nbsp;Main()<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyUnion&nbsp;mu&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;MyUnion();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mu.i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">99</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LibWrap.TestUnion(&nbsp;mu,&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mu.d&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">99.99</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LibWrap.TestUnion(&nbsp;mu,&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyUnion2_1&nbsp;mu2_1&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;MyUnion2_1();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mu2_1.i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">99</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LibWrap.TestUnion2(&nbsp;mu2_1,&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyUnion2_2&nbsp;mu2_2&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;MyUnion2_2();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mu2_2.str&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">***&nbsp;string&nbsp;***</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LibWrap.TestUnion2(&nbsp;mu2_2,&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>}</span></div>
<br>struct调用实例：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">//</span><span style="COLOR: #000000">&nbsp;Structs.cs<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>using&nbsp;System;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>using&nbsp;System.Runtime.InteropServices;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">/*</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>typedef&nbsp;struct&nbsp;_MYPERSON<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;first;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;last;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>}&nbsp;MYPERSON,&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">LP_MYPERSON;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">*/</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>[&nbsp;StructLayout(&nbsp;LayoutKind.Sequential,&nbsp;CharSet</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">CharSet.Ansi&nbsp;)]<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;struct&nbsp;MyPerson&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">String</span><span style="COLOR: #000000">&nbsp;first;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">String</span><span style="COLOR: #000000">&nbsp;last;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>}<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">/*</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>typedef&nbsp;struct&nbsp;_MYPERSON2<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;MYPERSON</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;person;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;age;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>}&nbsp;MYPERSON2,&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">LP_MYPERSON2;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">*/</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>[&nbsp;StructLayout(&nbsp;LayoutKind.Sequential&nbsp;)]<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;struct&nbsp;MyPerson2&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;IntPtr&nbsp;person;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;age;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>}<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">/*</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>typedef&nbsp;struct&nbsp;_MYPERSON3<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;MYPERSON&nbsp;person;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;age;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>}&nbsp;MYPERSON3;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">*/</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>[&nbsp;StructLayout(&nbsp;LayoutKind.Sequential&nbsp;)]<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;struct&nbsp;MyPerson3&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;MyPerson&nbsp;person;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;age;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>}<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">/*</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>typedef&nbsp;struct&nbsp;_MYARRAYSTRUCT<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;bool&nbsp;flag;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;vals[&nbsp;</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">&nbsp;];&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>}&nbsp;MYARRAYSTRUCT;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">*/</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>[&nbsp;StructLayout(&nbsp;LayoutKind.Sequential&nbsp;)]<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;struct&nbsp;MyArrayStruct&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;bool&nbsp;flag;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;[&nbsp;MarshalAs(&nbsp;UnmanagedType.ByValArray,&nbsp;SizeConst</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">&nbsp;)]&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">[]&nbsp;vals;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>}<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;class&nbsp;LibWrap<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">//</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;TestStructInStruct(MYPERSON2</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pPerson2);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;[&nbsp;DllImport(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">..\\LIB\\PinvokeLib.dll</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;)]<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;static&nbsp;extern&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;TestStructInStruct(&nbsp;ref&nbsp;MyPerson2&nbsp;person2&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">//</span><span style="COLOR: #000000">&nbsp;void&nbsp;TestStructInStruct3(MYPERSON3&nbsp;person3)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;[&nbsp;DllImport(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">..\\LIB\\PinvokeLib.dll</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;)]<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;static&nbsp;extern&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;TestStructInStruct3(&nbsp;MyPerson3&nbsp;person3&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">//</span><span style="COLOR: #000000">&nbsp;void&nbsp;TestArrayInStruct(&nbsp;MYARRAYSTRUCT</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pStruct&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;[&nbsp;DllImport(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">..\\LIB\\PinvokeLib.dll</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;)]<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;static&nbsp;extern&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;TestArrayInStruct(&nbsp;ref&nbsp;MyArrayStruct&nbsp;myStruct&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>}<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;class&nbsp;App<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;static&nbsp;void&nbsp;Main()<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">//</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*******************</span><span style="COLOR: #000000">&nbsp;structure&nbsp;</span><span style="COLOR: #0000ff">with</span><span style="COLOR: #000000">&nbsp;pointer&nbsp;</span><span style="COLOR: #0000ff">to</span><span style="COLOR: #000000">&nbsp;other&nbsp;structure&nbsp;</span><span style="COLOR: #000000">************</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyPerson&nbsp;personName;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;personName.first&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Sue</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;personName.last&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Black</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyPerson2&nbsp;personAll;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;personAll.age&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">30</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IntPtr&nbsp;buffer&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Marshal.AllocCoTaskMem(&nbsp;Marshal.SizeOf(&nbsp;personName&nbsp;));<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Marshal.StructureToPtr(&nbsp;personName,&nbsp;buffer,&nbsp;</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;personAll.person&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;buffer;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\nPerson&nbsp;before&nbsp;call:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">first&nbsp;=&nbsp;{0},&nbsp;last&nbsp;=&nbsp;{1},&nbsp;age&nbsp;=&nbsp;{2}</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;personName.first,&nbsp;personName.last,&nbsp;personAll.age&nbsp;);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;res&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;LibWrap.TestStructInStruct(&nbsp;ref&nbsp;personAll&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyPerson&nbsp;personRes&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(MyPerson)Marshal.PtrToStructure(&nbsp;personAll.person,&nbsp;typeof(&nbsp;MyPerson&nbsp;));<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Marshal.FreeCoTaskMem(&nbsp;buffer&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Person&nbsp;after&nbsp;call:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">first&nbsp;=&nbsp;{0},&nbsp;last&nbsp;=&nbsp;{1},&nbsp;age&nbsp;=&nbsp;{2}</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;personRes.first,&nbsp;personRes.last,&nbsp;personAll.age&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">//</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*******************</span><span style="COLOR: #000000">&nbsp;structure&nbsp;</span><span style="COLOR: #0000ff">with</span><span style="COLOR: #000000">&nbsp;embedded&nbsp;structure&nbsp;</span><span style="COLOR: #000000">************</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyPerson3&nbsp;person3&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;MyPerson3();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;person3.person.first&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Marie</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;person3.person.last&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Claire</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;person3.age&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">27</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LibWrap.TestStructInStruct3(&nbsp;person3&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">//</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*******************</span><span style="COLOR: #000000">&nbsp;structure&nbsp;</span><span style="COLOR: #0000ff">with</span><span style="COLOR: #000000">&nbsp;embedded&nbsp;</span><span style="COLOR: #0000ff">array</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">************</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyArrayStruct&nbsp;myStruct&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;MyArrayStruct();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myStruct.flag&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myStruct.vals&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">[&nbsp;</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">&nbsp;];<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myStruct.vals[&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myStruct.vals[&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myStruct.vals[&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">&nbsp;]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">9</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\nStructure&nbsp;with&nbsp;array&nbsp;before&nbsp;call:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(&nbsp;myStruct.flag&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">{0}&nbsp;{1}&nbsp;{2}</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;myStruct.vals[&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;],&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myStruct.vals[&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;],&nbsp;myStruct.vals[&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">&nbsp;]&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LibWrap.TestArrayInStruct(&nbsp;ref&nbsp;myStruct&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\nStructure&nbsp;with&nbsp;array&nbsp;after&nbsp;call:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(&nbsp;myStruct.flag&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">{0}&nbsp;{1}&nbsp;{2}</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;myStruct.vals[&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;],&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myStruct.vals[&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;],&nbsp;myStruct.vals[&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">&nbsp;]&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>}</span></div>
<br>其他的API，string，数组的调用实例：请下载:PlatformInvoke实例。
<img src ="http://www.cppblog.com/mzty/aggbug/25531.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2007-06-04 23:34 <a href="http://www.cppblog.com/mzty/archive/2007/06/04/25531.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C#通过C++/CLI调用C++DLL</title><link>http://www.cppblog.com/mzty/archive/2007/06/04/25524.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Mon, 04 Jun 2007 14:59:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2007/06/04/25524.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/25524.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2007/06/04/25524.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/25524.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/25524.html</trackback:ping><description><![CDATA[<br>只要你会C++/CLI就比较容易哦，或者说只要你会C++和C#学起来也是很快的哦！～<br><br><br><br>大家可以先参考，以后有时间加再写哦～<br><br><br>参考：<a href="http://www.codeproject.com/csharp/marshalCPPclass.asp">http://www.codeproject.com/csharp/marshalCPPclass.asp</a><br><br><br>
<img src ="http://www.cppblog.com/mzty/aggbug/25524.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2007-06-04 22:59 <a href="http://www.cppblog.com/mzty/archive/2007/06/04/25524.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C#调用C++的COM</title><link>http://www.cppblog.com/mzty/archive/2007/06/04/25522.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Mon, 04 Jun 2007 14:44:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2007/06/04/25522.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/25522.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2007/06/04/25522.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/25522.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/25522.html</trackback:ping><description><![CDATA[C#调用C++的COM比较简单，看下面的简单实例。<br><br>一 建立ATL COM ，增加接口ITest和实现函数Test，增加以下函数：<br>idl文件：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id=Codehighlighter1_27_364_Open_Image onclick="this.style.display='none'; Codehighlighter1_27_364_Open_Text.style.display='none'; Codehighlighter1_27_364_Closed_Image.style.display='inline'; Codehighlighter1_27_364_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_27_364_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_27_364_Closed_Text.style.display='none'; Codehighlighter1_27_364_Open_Image.style.display='inline'; Codehighlighter1_27_364_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top><span style="COLOR: #0000ff">interface</span><span style="COLOR: #000000">&nbsp;ITest&nbsp;:&nbsp;IDispatch</span><span id=Codehighlighter1_27_364_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_27_364_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;[id(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">),&nbsp;helpstring(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">method&nbsp;ADD</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)]&nbsp;HRESULT&nbsp;ADD([</span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000">]&nbsp;LONG&nbsp;x,&nbsp;[</span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000">]&nbsp;LONG&nbsp;y,&nbsp;LONG</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;z);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;[id(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">),&nbsp;helpstring(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">method&nbsp;UpperCase</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)]&nbsp;HRESULT&nbsp;UpperCase([</span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000">]&nbsp;CHAR&nbsp;A,&nbsp;CHAR</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;B);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;[id(</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">),&nbsp;helpstring(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">method&nbsp;LowerCase</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)]&nbsp;HRESULT&nbsp;LowerCase([</span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000">]&nbsp;BSTR&nbsp;A,&nbsp;BSTR</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;B);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;[id(</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">),&nbsp;helpstring(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">method&nbsp;Change</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)]&nbsp;HRESULT&nbsp;Change([</span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000">]&nbsp;VARIANT&nbsp;A,&nbsp;[</span><span style="COLOR: #0000ff">out</span><span style="COLOR: #000000">]&nbsp;VARIANT</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;B);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">;</span></div>
<br>ITest文件：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&nbsp;MIDL_INTERFACE(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">52CA8A5C-593D-4E2E-B58F-BB6C6604EAF2</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;ITest&nbsp;:&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;IDispatch<br><img id=Codehighlighter1_89_719_Open_Image onclick="this.style.display='none'; Codehighlighter1_89_719_Open_Text.style.display='none'; Codehighlighter1_89_719_Closed_Image.style.display='inline'; Codehighlighter1_89_719_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_89_719_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_89_719_Closed_Text.style.display='none'; Codehighlighter1_89_719_Open_Image.style.display='inline'; Codehighlighter1_89_719_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_89_719_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_89_719_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br><img id=Codehighlighter1_119_140_Open_Image onclick="this.style.display='none'; Codehighlighter1_119_140_Open_Text.style.display='none'; Codehighlighter1_119_140_Closed_Image.style.display='inline'; Codehighlighter1_119_140_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_119_140_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_119_140_Closed_Text.style.display='none'; Codehighlighter1_119_140_Open_Image.style.display='inline'; Codehighlighter1_119_140_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span id=Codehighlighter1_119_140_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id=Codehighlighter1_119_140_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;[helpstring][id]&nbsp;</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000">&nbsp;HRESULT&nbsp;STDMETHODCALLTYPE&nbsp;ADD(&nbsp;<br><img id=Codehighlighter1_186_195_Open_Image style="DISPLAY: inline" onclick="this.style.display='none'; Codehighlighter1_186_195_Open_Text.style.display='none'; Codehighlighter1_186_195_Closed_Image.style.display='inline'; Codehighlighter1_186_195_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_186_195_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_186_195_Closed_Text.style.display='none'; Codehighlighter1_186_195_Open_Image.style.display='inline'; Codehighlighter1_186_195_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_186_195_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id=Codehighlighter1_186_195_Open_Text style="DISPLAY: inline"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;[in]&nbsp;</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000">&nbsp;LONG&nbsp;x,<br><img id=Codehighlighter1_217_226_Open_Image onclick="this.style.display='none'; Codehighlighter1_217_226_Open_Text.style.display='none'; Codehighlighter1_217_226_Closed_Image.style.display='inline'; Codehighlighter1_217_226_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_217_226_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_217_226_Closed_Text.style.display='none'; Codehighlighter1_217_226_Open_Image.style.display='inline'; Codehighlighter1_217_226_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_217_226_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id=Codehighlighter1_217_226_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;[in]&nbsp;</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000">&nbsp;LONG&nbsp;y,<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LONG&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">z)&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img id=Codehighlighter1_287_308_Open_Image onclick="this.style.display='none'; Codehighlighter1_287_308_Open_Text.style.display='none'; Codehighlighter1_287_308_Closed_Image.style.display='inline'; Codehighlighter1_287_308_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_287_308_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_287_308_Closed_Text.style.display='none'; Codehighlighter1_287_308_Open_Image.style.display='inline'; Codehighlighter1_287_308_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span id=Codehighlighter1_287_308_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id=Codehighlighter1_287_308_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;[helpstring][id]&nbsp;</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000">&nbsp;HRESULT&nbsp;STDMETHODCALLTYPE&nbsp;UpperCase(&nbsp;<br><img id=Codehighlighter1_360_369_Open_Image onclick="this.style.display='none'; Codehighlighter1_360_369_Open_Text.style.display='none'; Codehighlighter1_360_369_Closed_Image.style.display='inline'; Codehighlighter1_360_369_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_360_369_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_360_369_Closed_Text.style.display='none'; Codehighlighter1_360_369_Open_Image.style.display='inline'; Codehighlighter1_360_369_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_360_369_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id=Codehighlighter1_360_369_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;[in]&nbsp;</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000">&nbsp;CHAR&nbsp;A,<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CHAR&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">B)&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img id=Codehighlighter1_430_451_Open_Image onclick="this.style.display='none'; Codehighlighter1_430_451_Open_Text.style.display='none'; Codehighlighter1_430_451_Closed_Image.style.display='inline'; Codehighlighter1_430_451_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_430_451_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_430_451_Closed_Text.style.display='none'; Codehighlighter1_430_451_Open_Image.style.display='inline'; Codehighlighter1_430_451_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span id=Codehighlighter1_430_451_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id=Codehighlighter1_430_451_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;[helpstring][id]&nbsp;</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000">&nbsp;HRESULT&nbsp;STDMETHODCALLTYPE&nbsp;LowerCase(&nbsp;<br><img id=Codehighlighter1_503_512_Open_Image onclick="this.style.display='none'; Codehighlighter1_503_512_Open_Text.style.display='none'; Codehighlighter1_503_512_Closed_Image.style.display='inline'; Codehighlighter1_503_512_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_503_512_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_503_512_Closed_Text.style.display='none'; Codehighlighter1_503_512_Open_Image.style.display='inline'; Codehighlighter1_503_512_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_503_512_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id=Codehighlighter1_503_512_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;[in]&nbsp;</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000">&nbsp;BSTR&nbsp;A,<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BSTR&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">B)&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img id=Codehighlighter1_573_594_Open_Image onclick="this.style.display='none'; Codehighlighter1_573_594_Open_Text.style.display='none'; Codehighlighter1_573_594_Closed_Image.style.display='inline'; Codehighlighter1_573_594_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_573_594_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_573_594_Closed_Text.style.display='none'; Codehighlighter1_573_594_Open_Image.style.display='inline'; Codehighlighter1_573_594_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span id=Codehighlighter1_573_594_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id=Codehighlighter1_573_594_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;[helpstring][id]&nbsp;</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000">&nbsp;HRESULT&nbsp;STDMETHODCALLTYPE&nbsp;Change(&nbsp;<br><img id=Codehighlighter1_643_652_Open_Image onclick="this.style.display='none'; Codehighlighter1_643_652_Open_Text.style.display='none'; Codehighlighter1_643_652_Closed_Image.style.display='inline'; Codehighlighter1_643_652_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_643_652_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_643_652_Closed_Text.style.display='none'; Codehighlighter1_643_652_Open_Image.style.display='inline'; Codehighlighter1_643_652_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_643_652_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id=Codehighlighter1_643_652_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;[in]&nbsp;</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000">&nbsp;VARIANT&nbsp;A,<br><img id=Codehighlighter1_677_687_Open_Image onclick="this.style.display='none'; Codehighlighter1_677_687_Open_Text.style.display='none'; Codehighlighter1_677_687_Closed_Image.style.display='inline'; Codehighlighter1_677_687_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_677_687_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_677_687_Closed_Text.style.display='none'; Codehighlighter1_677_687_Open_Image.style.display='inline'; Codehighlighter1_677_687_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_677_687_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id=Codehighlighter1_677_687_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;[out]&nbsp;</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000">&nbsp;VARIANT&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">B)&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">;</span></div>
<p><br>在Test中实现以上接口函数。<br><br>二 在C#中的使用方法<br><br>1）使用IDE中的reference来reference com，这个之前com必须先注册：<br><img src="http://www.cppblog.com/images/cppblog_com/mzty/2021/o_com%20reference.jpg" border=0><br><br>2）使用命令TLBIMP ATLCOM.tlb /out:C:\ATLCOM.dll ,然后referece生成的DLL（tblmp命令帮你注册com）。<br><br>3）<a onclick="javascript:Track('ctl00_LibFrame_ctl04|ctl00_LibFrame_ctl09',this);" href="http://msdn2.microsoft.com/zh-cn/library/system.runtime.interopservices.typelibconverter(VS.80).aspx"><u><font color=#0000ff>TypeLibConverter</font></u></a> 类 <br><strong>TypeLibConverter</strong> 类（位于 <a onclick="javascript:Track('ctl00_LibFrame_ctl04|ctl00_LibFrame_ctl10',this);" href="http://msdn2.microsoft.com/zh-cn/library/system.runtime.interopservices(VS.80).aspx"><u><font color=#0000ff>System.Runtime.InteropServices</font></u></a> 命名空间中）提供了将类型库中的 coclass 和接口转换为程序集中的元数据的方法。此 API 将生成与 Tlbimp.exe 相同的元数据输出。不过，与 Tlbimp.exe 不同的是，<strong>TypeLibConverter</strong> 类可以将内存中的类型库转换为元数据。<br><br>&nbsp;4）自定义包装 <br>当类型库不可用或不正确时，一种可选的做法是在托管源代码中创建类或接口的重复定义。然后，用面向运行库的编译器来编译源代码以生成程序集中的元数据。 <br>要手动定义 COM 类型，必须具备下列各项： </p>
<p>所定义的 coclass 和接口的精确描述。<br>可生成正确 .NET Framework 类定义的编译器，如 C# 编译器。<br>有关类型库到程序集转换规则的知识。</p>
<p>编写自定义包装是一种较少使用的高级技术。有关生成自定义包装的其他信息，请参见<a onclick="javascript:Track('ctl00_LibFrame_ctl04|ctl00_LibFrame_ctl11',this);" href="http://msdn2.microsoft.com/zh-cn/library/h7hx9abd(VS.80).aspx"><u><font color=#0000ff>自定义标准包装</font></u></a>。<br><br>三 在C#的client调用COM提供的接口，我们可以看到在C#中COM的接口和函数被变换为如下：<br>Member of atlcom.TestClass：<br>public TestClass();&nbsp;&nbsp;&nbsp; <br>public virtual void ADD(int x, int y, ref int z);<br>public virtual void UpperCase(sbyte A, ref sbyte B);<br>public virtual void Change(object A, out object B) ;&nbsp;&nbsp; <br>public virtual void LowerCase(string A, ref string B);<br><br>四 更多可以参考：<a href="http://www.codeproject.com/dotnet/cominterop.asp">http://www.codeproject.com/dotnet/cominterop.asp</a><br><br><br><br><br></p>
<img src ="http://www.cppblog.com/mzty/aggbug/25522.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2007-06-04 22:44 <a href="http://www.cppblog.com/mzty/archive/2007/06/04/25522.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C#通过p/invoke调用C++ DLL （转）</title><link>http://www.cppblog.com/mzty/archive/2007/06/04/25518.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Mon, 04 Jun 2007 12:35:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2007/06/04/25518.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/25518.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2007/06/04/25518.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/25518.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/25518.html</trackback:ping><description><![CDATA[<br>转自：<a href="http://hacker.cnblogs.com/archive/2004/08/12/32563.aspx">http://hacker.cnblogs.com/archive/2004/08/12/32563.aspx</a><br><br>1， PInvoke什么意思？ Platform Invocation Services<br><br>2, 干什么用?&nbsp; 导入外部函数？什么是外部函数，就是不属于.Net托管的函数。<br><br>3，如何用？看下面的例子。用[DllImport(dllname)]来实现，但是首先要把System.Runtiime.InteropServices using进来。但是不using也行，就要敲全称，随你便了。<br>
<div><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>[DllImport("user32.dll")]&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;extern&nbsp;int&nbsp;MessageBoxA(int&nbsp;hWnd,<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;msg,<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;caption,<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;type&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;void&nbsp;button1_Click(object&nbsp;sender,&nbsp;System.EventArgs&nbsp;e)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_327_404_Open_Image onclick="this.style.display='none'; Codehighlighter1_327_404_Open_Text.style.display='none'; Codehighlighter1_327_404_Closed_Image.style.display='inline'; Codehighlighter1_327_404_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_327_404_Closed_Image onclick="this.style.display='none'; Codehighlighter1_327_404_Closed_Text.style.display='none'; Codehighlighter1_327_404_Open_Image.style.display='inline'; Codehighlighter1_327_404_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBoxA(&nbsp;0,&nbsp;"Msg:hello",&nbsp;"Caption:Hello",0&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></div>
<br><br>
<p>4，万一我的程序中已经有了一个函数叫MessageBoxA怎么办？这时候，可以使用EntryPoint来帮忙，下面的例子中,你把自己的函数定义为MyMsg.<br></p>
<div><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>[DllImport("user32.dll",EntryPoint="MessageBoxA")]<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;extern&nbsp;int&nbsp;MyMsg(int&nbsp;hWnd,<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;msg,<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;caption,<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;type&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;void&nbsp;button1_Click(object&nbsp;sender,&nbsp;System.EventArgs&nbsp;e)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_346_417_Open_Image onclick="this.style.display='none'; Codehighlighter1_346_417_Open_Text.style.display='none'; Codehighlighter1_346_417_Closed_Image.style.display='inline'; Codehighlighter1_346_417_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_346_417_Closed_Image onclick="this.style.display='none'; Codehighlighter1_346_417_Closed_Text.style.display='none'; Codehighlighter1_346_417_Open_Image.style.display='inline'; Codehighlighter1_346_417_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyMsg(&nbsp;0,&nbsp;"Msg:hello",&nbsp;"Caption:Hello",0&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></div>
<p><br><br>5，charset如何使用？****A的是Ansi编码，****W的是unicode编码，如何使用charset,看你的函数调用而定。2K以后都用unicode了，前面的9x都是ansi编码，但是这是缺省的，微软给9x打布丁支持unicode不算。<br></p>
<p>API有两个版本: A(ASNI)版本和W(Unicode)版本. A版本调用时候会用ANSI来封送字符串,一般是win95/98上。W版本用Unicode来封送，在NT,2K和XP上。</p>
<p>.Net和win32交互的时候，默认是使用CharSet.Ansi来传送。</p>
<p>在 <mshelp:link tabIndex=0 keywords="frlrfSystemRuntimeInteropServicesDllImportAttributeClassExactSpellingTopic">DllImportAttribute.ExactSpelling</mshelp:link> 字段为 true 时（它是 Visual Basic .NET 中的默认值），平台调用将只搜索您指定的名称。例如，如果指定 MessageBox，则平台调用将搜索 MessageBox，如果它找不到完全相同的拼写则失败。
<p>当 ExactSpelling 字段为 false（它是 C++ 托管扩展和 C# 中的默认值），平台调用将首先搜索未处理的别名 (MessageBox)，如果没有找到未处理的别名，则将搜索已处理的名称 (MessageBoxA)。请注意，ANSI 名称匹配行为与 Unicode 名称匹配行为不同。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br></p>
<div><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;//CharSet.Ansi&nbsp;will&nbsp;call&nbsp;MessageBoxA<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//CharSet.Unicode&nbsp;will&nbsp;call&nbsp;MessageBoxW<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[DllImport("user32.dll",EntryPoint="MessageBox",CharSet=CharSet.Ansi)]<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;extern&nbsp;int&nbsp;MyMsg(int&nbsp;hWnd,<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;msg,<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;caption,<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;type&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;void&nbsp;button1_Click(object&nbsp;sender,&nbsp;System.EventArgs&nbsp;e)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_467_538_Open_Image onclick="this.style.display='none'; Codehighlighter1_467_538_Open_Text.style.display='none'; Codehighlighter1_467_538_Closed_Image.style.display='inline'; Codehighlighter1_467_538_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_467_538_Closed_Image onclick="this.style.display='none'; Codehighlighter1_467_538_Closed_Text.style.display='none'; Codehighlighter1_467_538_Open_Image.style.display='inline'; Codehighlighter1_467_538_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyMsg(&nbsp;0,&nbsp;"Msg:hello",&nbsp;"Caption:Hello",0&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></div>
<p align=left><br>6，Dll里面的callback函数如何实现？看下面这个例子:</p>
<div><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>delegate&nbsp;bool&nbsp;CallBackDef(&nbsp;int&nbsp;hWnd,&nbsp;int&nbsp;lParm&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[DllImport("user32.dll")]<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;extern&nbsp;int&nbsp;GetWindowText(&nbsp;int&nbsp;hWnd,<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuilder&nbsp;text,<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;count&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[DllImport("user32.dll")]<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;extern&nbsp;int&nbsp;EnumWindows(CallBackDef&nbsp;callback,&nbsp;int&nbsp;lParam&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;bool&nbsp;PrintWindow(int&nbsp;hWnd,&nbsp;int&nbsp;lParm&nbsp;)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_470_675_Open_Image onclick="this.style.display='none'; Codehighlighter1_470_675_Open_Text.style.display='none'; Codehighlighter1_470_675_Closed_Image.style.display='inline'; Codehighlighter1_470_675_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_470_675_Closed_Image onclick="this.style.display='none'; Codehighlighter1_470_675_Closed_Text.style.display='none'; Codehighlighter1_470_675_Open_Image.style.display='inline'; Codehighlighter1_470_675_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuilder&nbsp;text&nbsp;=&nbsp;new&nbsp;StringBuilder(255);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetWindowText(&nbsp;hWnd,&nbsp;text,&nbsp;255&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(&nbsp;text.ToString()&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;true;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;void&nbsp;button1_Click(object&nbsp;sender,&nbsp;System.EventArgs&nbsp;e)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_762_887_Open_Image onclick="this.style.display='none'; Codehighlighter1_762_887_Open_Text.style.display='none'; Codehighlighter1_762_887_Closed_Image.style.display='inline'; Codehighlighter1_762_887_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_762_887_Closed_Image onclick="this.style.display='none'; Codehighlighter1_762_887_Closed_Text.style.display='none'; Codehighlighter1_762_887_Open_Image.style.display='inline'; Codehighlighter1_762_887_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CallBackDef&nbsp;callBack&nbsp;=&nbsp;new&nbsp;CallBackDef(&nbsp;PrintWindow&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EnumWindows(&nbsp;callBack,&nbsp;0&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></div>
<p align=left><br>7,MarshalAs如何用，什么时候用?<br>在MessageBox传递string去Dll的时，C#编译器知道Win32LPSTR等价与一个C#字符串。但是如果想覆盖默认.Net行为, 这时候就需要MarshallAs<br></p>
<div><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>[DllImport("user32.dll",&nbsp;CharSet=CharSet.Unicode&nbsp;)]<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;extern&nbsp;int&nbsp;MessageBox(&nbsp;int&nbsp;hWnd,<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[MarshalAs(UnmanagedType.LPWStr)]<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;msg,<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[MarshalAs(UnmanagedType.LPWStr)]<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;caption,<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;type);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></div>
<p align=left><br><br>8,我怎么知道要调用的函数在那个dll了？<br>这个问题我不会比你更清楚，特殊的函数应该在你特殊的dll中。Win32中常用的几个dll是user32.dll, kernel32.dll和GDI32.dll.用dumpbin -exports kernel32.dll可以看到这个dll所有的API函数。<br><br>9，相互之间传递struct怎么办？我是说传递很复杂的struct?<br>传递一个结构，这个要用到StructLayoutAttribute属性。比如：</p>
<p>PtInRect 具有以下非托管签名：<br>BOOL PtInRect(const RECT *lprc, POINT pt);<br>请注意，由于函数需要指向 RECT 类型的指针，必须通过引用来传递 Rect 结构。<br></p>
<div><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>using&nbsp;System.Runtime.InteropServices;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>[StructLayout(LayoutKind.Sequential)]<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>public&nbsp;struct&nbsp;Point&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_101_144_Open_Image onclick="this.style.display='none'; Codehighlighter1_101_144_Open_Text.style.display='none'; Codehighlighter1_101_144_Closed_Image.style.display='inline'; Codehighlighter1_101_144_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_101_144_Closed_Image onclick="this.style.display='none'; Codehighlighter1_101_144_Closed_Text.style.display='none'; Codehighlighter1_101_144_Open_Image.style.display='inline'; Codehighlighter1_101_144_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top><img src="http://www.cppblog.com/Images/dot.gif">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;int&nbsp;x;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;int&nbsp;y;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>[StructLayout(LayoutKind.Explicit)]<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>public&nbsp;struct&nbsp;Rect&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_211_377_Open_Image onclick="this.style.display='none'; Codehighlighter1_211_377_Open_Text.style.display='none'; Codehighlighter1_211_377_Closed_Image.style.display='inline'; Codehighlighter1_211_377_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_211_377_Closed_Image onclick="this.style.display='none'; Codehighlighter1_211_377_Closed_Text.style.display='none'; Codehighlighter1_211_377_Open_Image.style.display='inline'; Codehighlighter1_211_377_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top><img src="http://www.cppblog.com/Images/dot.gif">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[FieldOffset(0)]&nbsp;public&nbsp;int&nbsp;left;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[FieldOffset(4)]&nbsp;public&nbsp;int&nbsp;top;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[FieldOffset(8)]&nbsp;public&nbsp;int&nbsp;right;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[FieldOffset(12)]&nbsp;public&nbsp;int&nbsp;bottom;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>class&nbsp;Win32API&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_403_501_Open_Image onclick="this.style.display='none'; Codehighlighter1_403_501_Open_Text.style.display='none'; Codehighlighter1_403_501_Closed_Image.style.display='inline'; Codehighlighter1_403_501_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_403_501_Closed_Image onclick="this.style.display='none'; Codehighlighter1_403_501_Closed_Text.style.display='none'; Codehighlighter1_403_501_Open_Image.style.display='inline'; Codehighlighter1_403_501_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top><img src="http://www.cppblog.com/Images/dot.gif">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[DllImport("User32.dll")]<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;extern&nbsp;bool&nbsp;PtInRect(ref&nbsp;Rect&nbsp;r,&nbsp;Point&nbsp;p);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></div>
<p><br>10，哪里有不错的教程，我可以学到更详细的东西?<br>google一下多的是。MSDN里面也有一些不错的教程:(vs.net 2003)<br><br><o:p>&nbsp;</p>
<dt><a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconplatforminvokedatatypes.htm">平台调用数据类型</a>
<dd>提供托管数据类型及其相应的非托管数据类型的列表。
<dt><a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconmarshalingstrings.htm">封送字符串</a>
<dd>描述如何通过值、通过引用、在结构中、在类中和在数组中传递字符串。
<dt><a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconmarshalingclassesstructuresunions.htm">封送类、结构和联合</a>
<dd>描述如何通过值传递类，如何传递各种结构以及如何传递具有值和混合类型的联合。
<dt><a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconmarshalingarraysoftypes.htm">封送类型数组</a>
<dd>描述如何通过值传递多维整数数组以及如何通过引用传递一维数组。
<dt><a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconmiscellaneousmarshalingsamples.htm">其他封送处理示例</a>
<dd>描述影响 Interop 封送处理行为的垃圾回收和线程处理的各个方面。</o:p> <br><br>11,最后，这位大哥，你说了很多，我想问一个对我来说最关键的问题，我看了你的东西，似是而非，不会用怎么办？<br><br>这位兄弟勇气可嘉，我给你准备了一个站点。这里有一个PInvoke的Add-In tools for Visual Studio.Net,几乎所有的Win32 API都有。安装了以后，基本不用自己写了。
<dd><a href="http://www.pinvoke.net/">http://www.pinvoke.net</a> </dd>
<img src ="http://www.cppblog.com/mzty/aggbug/25518.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2007-06-04 20:35 <a href="http://www.cppblog.com/mzty/archive/2007/06/04/25518.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C# DLL COM</title><link>http://www.cppblog.com/mzty/archive/2007/05/29/25043.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Tue, 29 May 2007 03:02:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2007/05/29/25043.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/25043.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2007/05/29/25043.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/25043.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/25043.html</trackback:ping><description><![CDATA[<br>前言:为了介绍C#写界面，C++写算法的快捷交互开发方式，首先介绍c++，C#内部的DLL，COM调用.<br><br>一， C# DLL<br>C#创建DLL非常的简单，只需要创建工程，选择工程类型为class libaray即可。这里不介绍。<br><br>二，C# COM<br>C#创建COM，相对与一般的DLL，有几个地方需要注意，看下面的实例：<br><br>
<h3>Steps to create a Managed .NET C# COM Object:</h3>
<ol>
    <li nd="6">Open VS.NET2003-&gt;New Project-&gt;Visual C# Projects-&gt;Class Library.
    <li nd="7">Project name: MyInterop.
    <li nd="8">Create <em>MyDoNetClass.cs</em> file, and add the following lines of code:
    <pre lang=cs nd="10"><span class=cs-keyword nd="9">using</span> System.Runtime.InteropServices;
    <span class=cs-keyword nd="11">using</span> System.Windows.Forms;</pre>
    <li nd="12">Create an Interface <code nd="13">IMyDotNetInterface</code>.
    <li nd="14">Create a class <code nd="15">MyDoNetClass</code>.
    <li nd="16">Add the following line for <code nd="17">MyDotNetClass</code>:
    <pre lang=cs nd="18">[ClassInterface(ClassInterfaceType.None)]</pre>
    </li>
</ol>
<p nd="19">Although a .NET class is not directly invokable from unmanaged code, Microsoft has provided the capability of wrapping a .NET interface in an unmanaged layer of code that exposes the methods and properties of the .NET class as if the class were a COM object. There are two requirements for making a .NET class visible to unmanaged code as a COM object:</p>
<h3>Requirement 1:</h3>
<h4>You have to add GUIDs - Globally Unique Identifiers - into your code for the interface and the class separately, through a GUID tool.</h4>
<p><img height=337 src="http://www.codeproject.com/csharp/ManagedCOM/ManagedCOM.gif" width=373></p>
<ol start=7>
    <li nd="20">Now, create a GUID for the Interface, and add the following line for the interface:
    <pre lang=cs nd="21">[Guid(<span class=cpp-string nd="22">"03AD5D2D-2AFD-439f-8713-A4EC0705B4D9"</span>)]</pre>
    <li nd="23">Now, create a GUID for the class, and add the following line for the class:
    <pre lang=cs nd="24">[Guid(<span class=cpp-string nd="25">"0490E147-F2D2-4909-A4B8-3533D2F264D0"</span>)]</pre>
    <li nd="26">Your code will look like:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </li>
</ol>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">using&nbsp;System;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>using&nbsp;System.Runtime.InteropServices;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>using&nbsp;System.Windows.Forms;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>namespace&nbsp;MyInterop<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;[Guid(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">03AD5D2D-2AFD-439f-8713-A4EC0705B4D9</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)]<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;interface&nbsp;IMyDotNetInterface<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;ShowCOMDialog();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;[ClassInterface(ClassInterfaceType.None)]<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;[Guid(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">0490E147-F2D2-4909-A4B8-3533D2F264D0</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)]<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;class&nbsp;MyDotNetClass&nbsp;:&nbsp;IMyDotNetInterface<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">//</span><span style="COLOR: #000000">&nbsp;Need&nbsp;a&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;default&nbsp;constructor&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;COM&nbsp;Interop.<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;MyDotNetClass()<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{}<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;void&nbsp;ShowCOMDialog()<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.Windows.Forms.MessageBox.Show(&#8220;I&nbsp;am&nbsp;a</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;+&nbsp;</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;&nbsp;Managed&nbsp;DotNET&nbsp;C#&nbsp;COM&nbsp;Object&nbsp;Dialog&#8221;);</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>}<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<p nd="26">&nbsp;</p>
<p nd="26">10，Compile the solution. </p>
<p nd="43">11，You will see inside the project directory-&gt;obj-&gt;debug directory, the file &#8220;<em>MyInterop.dll</em>&#8221; generated after compilation. </p>
<h3>Requirement 2:</h3>
<h4>Registration of the COM Class and Interfaces</h4>
<p nd="44">For a COM class to be accessible by the client at runtime, the COM infrastructure must know how to locate the code that implements the COM class. COM doesn't know about .NET classes, but .NET provides a general "surrogate" DLL - <em>mscoree.dll</em> -- which acts as the wrapper and intermediary between the COM client and the .NET class.</p>
<ol start=12>
    <li nd="45">Hard-code a specific version number in your <code nd="46">AssemblyVersion</code> attribute in the <em>AssemblyInfo.cs</em> file which is in your project.
    <p nd="47">Example:</p>
    <pre lang=cs nd="48">[assembly: AssemblyVersion(<span class=cpp-string nd="49">"1.0.0.0"</span>)]</pre>
    <li nd="50">Create a strong-name key pair for your assembly and point to it via the <code nd="51">AssemblyKeyFile</code> attribute in the <em>AssemblyInfo.cs</em> file which is in your project. Example:
    <pre lang=text nd="52">sn -k TestKeyPair.snk</pre>
    <pre lang=cs nd="53">[assembly: AssemblyKeyFile(<span class=cpp-string nd="54">"TestKeyPair.snk"</span>)]</pre>
    <li nd="55">Add your assembly to the GAC using the following command:
    <pre lang=text nd="56">gacutil /i MyInterop.dll</pre>
    <li nd="57">Register your assembly for COM by using the REGASM command along with the "/tlb" option to generate a COM type library.
    <pre lang=text nd="58">REGASM MyInterop.dll /tlb:com.MyInterop.tlb</pre>
    <li nd="59">Close the C# project. </li>
</ol>
<p nd="59">&nbsp;&nbsp;&nbsp; 到此COM创建完毕，可以被C#和Native的client调用。<br><br>三，C#内部调用<br>C#对C#的COM的调用和一般的DLL的调用一样的简单，只需要在工程中reference 所需要的COM或DLL。（Net真强！）<br><br>四，总结 <br>一般使用C#开发DLL，即程序集，一般不开发COM，如果是要开发COM，一般了为了兼容以前的COM，则这个时候可以考虑把以前的COM转化net的程序集来使用。一般C#的COM会被Native代码来调用，具体的C++调用C#的COM见后面的章节。<br><br>参考：<a href="http://www.codeproject.com/csharp/ManagedCOM.asp">http://www.codeproject.com/csharp/ManagedCOM.asp</a>&nbsp; （包含上面的实例代码下载，C# 的Client的调用很简单，自己写！：~）<br><br>简单实例下载：<a href="http://www.cppblog.com/Files/mzty/C#COM.rar">http://www.cppblog.com/Files/mzty/C#COM.rar</a></p><img src ="http://www.cppblog.com/mzty/aggbug/25043.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2007-05-29 11:02 <a href="http://www.cppblog.com/mzty/archive/2007/05/29/25043.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>.net程序的安装制作和发布</title><link>http://www.cppblog.com/mzty/archive/2007/05/22/24649.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Tue, 22 May 2007 15:31:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2007/05/22/24649.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/24649.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2007/05/22/24649.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/24649.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/24649.html</trackback:ping><description><![CDATA[<div class=postText>
<div class=text2>摘要</div>
<div class=text4></div>
<div class=text4>本文讨论了如何使用Windows Installer技术发布.NET程序，以及如何使用native代码判断目标机器上是否安装有.NET Framework; 如果没有，将自动安装.NET Framework然后安装作者自己的.NET程序。</div>
<hr color=#cccccc SIZE=1>
<div class=text2>目录</div>
<div class=text4></div>
<ul class=list1>
    <li class=list2><strong></strong>本文内容
    <li class=list2><strong></strong>制作自己的安装程序
    <li class=list2><strong></strong>发布.NET Framework
    <li class=list2><strong></strong>制作自己的native安装程序
    <li class=list2><strong></strong>使用方法
    <li class=list2><strong></strong>总结
    <li class=list2><strong></strong>作者 </li>
</ul>
<hr color=#cccccc SIZE=1>
<div class=text2>本文内容</div>
<div class=text4></div>
<div class=text4>1． 使用VS.NET来制作安装程序。</div>
<div class=text4>2． 如何把.NET Framework 部署到目标机器。</div>
<div class=text4>3． 如何使用Native代码把.NET Framework和自己的安装程序制作为一个统一的安装程序。该程序做到如果目标机器上没有.NET Framework，将自动安装.NET Framework然后再自动安装作者自己的程序。</div>
<hr color=#cccccc SIZE=1>
<div class=text2>制作自己的安装程序</div>
<div class=text4></div>
<div class=text4>在VS.NET中，我们可以通过建立"Setup and Deployment Projects"项目，非常灵活方便的把自己的.NET程序制作为Windows Installer文件。比如，我们可以很方便的定制下面这些选项：</div>
<div class=text4>1． 是否在桌面上放置快捷方式。</div>
<div class=text4>2． 注册自己的文件类型，可以通过双击该文件来使用自己的程序打开。</div>
<div class=text4>3． 注册表的处理</div>
<div class=text4>在下面的MSDN站点，我们可以获得在VS.NET中通过Setup and Deployment Projects来制作自己的安装程序的示例：</div>
<div class=text4>http://msdn.microsoft.com/library/en-us/vsintro7/html/vbconDeploymentScenarios.asp</div>
<hr color=#cccccc SIZE=1>
<div class=text2>发布.NET Framework</div>
<div class=text4></div>
<div class=text4>.NET Framework 1.0提供一个用来重新部署.NET的exe文件：Dotnetfx.exe. 它包含了Common Language Runtime和其它.NET程序运行时必不可少的内容。</div>
<div class=text4>我们可以从下面的站点下载该exe文件：</div>
<div class=text4>http://msdn.microsoft.com/downloads/sample.asp?url=/MSDN-FILES/027/001/829/msdncompositedoc.xml</div>
<div class=text4>同时，我们也可以在VS.NET安装CD或者DVD中找到该文件。</div>
<div class=text4>我们可以通过多种方式来通过运行Dotnetfx.exe把.NET Framework部署到目标机器上：</div>
<div class=text4>1． 通过Microsoft Systems Management Server部署。</div>
<div class=text4>2． 通过Active Directory部署。</div>
<div class=text4>3． 使用第三方工具。</div>
<div class=text4>具体的信息，我们可以参阅下面的文章：</div>
<div class=text4>http://msdn.microsoft.com/library/en-us/dnnetdep/html/redistdeploy.asp</div>
<hr color=#cccccc SIZE=1>
<div class=text2>制作自己的native安装程序</div>
<div class=text4></div>
<div class=text4>如果我们要把自己的.NET程序发布到目标机器上，同时我们不确定该目标机器是否已经安装了.NET Framework, 那我们就需要自己设计一段unmanaged代码，来判断目标机器是否安装了.NET Framework, 如果没有，则运行Dotnetfx.exe安装.NET Framework, 然后利用Windows Installer安装自己的程序。</div>
<div class=text4>在MSDN的下面网页上，我们可以获得一个使用unmanaged C++实现的安装程序和它的源代码：</div>
<div class=text4>http://msdn.microsoft.com/downloads/default.asp?URL=/code/sample.asp?url=/msdn-files/027/001/830/msdncompositedoc.xml</div>
<div class=text4>1． 在CSettings class中，通过读取"settings.ini",获得您自己的MSI安装文件和dotnetfx.exe的路径，以及其他您自己的设置。（比如.NET Framework的语言版本）</div>
<div class=text4>GetCaptionText(void)</div>
<div class=text4>GetDialogText(void)</div>
<div class=text4>GetErrorCaptionText(void)</div>
<div class=text4>GetIniName(void)</div>
<div class=text4>GetProductName(void)</div>
<div class=text4></div>
<div class=text4>Parse()函数用来解析settings.ini文件。</div>
<div class=text4>2． 在Main.cpp文件中，全局函数FxInstallRequired()判断是否要在目标机器上安装.NET Framework. FxInstallRequired()会检测下面的注册表键值和dotnetfx.exe的版本和语言设置。</div>
<div class=text4>HKLM\SOFTWARE\Microsoft\.NETFramework\policy\v1.0</div>
<div class=text4>3．如果需要安装.NET Framework, 在全局函数ExecCmd()中调用下面的命令silent安装dotnetfx.exe：</div>
<div class=text4>dotnetfx.exe /q:a /c:"install /l /q"</div>
<div class=text4>4。 在ExecCmd()全局函数中调用下面的命令安装您自己的MSI文件：</div>
<div class=text4>msiexec /i &lt;your MSI file&gt; REBOOT=ReallySuppress</div>
<hr color=#cccccc SIZE=1>
<div class=text2>使用方法</div>
<div class=text4></div>
<div class=text4>如果我们使用上面的native代码作为自己的安装程序，那么我们可以通过下面的步骤把自己的.NET程序和它结合在一起：</div>
<div class=text4>1．把您自己的.NET程序制作成为Windows Installer (.MSI)文件。</div>
<div class=text4>2．打开"settings.ini"文件，在"Msi" key中设置您自己的.NET程序的MSI文件路径和文件名；在"FxInstallerPath" Key中，设置dotnetfx.exe的路径。具体的参数信息，您可以从下面文章中得到：</div>
<div class=text4>http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetdep/html/redistdeploy.asp</div>
<div class=text4>3. 把"setup.exe", "settings.ini", "dotnetfx.exe"和您自己的MSI安装文件，发送到目标机器上，然后运行"setup.exe", 安装程序会自动检测是否有.NET Framwork, 如果没有，将首先运行dotnetfx.exe。</div>
<div class=text4>通过上述步骤，您可以将自己的.NET程序成功的部署到没有安装.NET Framwork环境的机器上。</div>
<hr color=#cccccc SIZE=1>
<div class=text2>总结</div>
<div class=text4></div>
<div class=text4>通过上述步骤，您可以将自己的.NET程序成功的部署到没有安装.NET Framwork环境的机器上。</div>
</div>
<img src ="http://www.cppblog.com/mzty/aggbug/24649.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2007-05-22 23:31 <a href="http://www.cppblog.com/mzty/archive/2007/05/22/24649.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C#界面，C++算法</title><link>http://www.cppblog.com/mzty/archive/2007/04/16/22064.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Mon, 16 Apr 2007 14:41:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2007/04/16/22064.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/22064.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2007/04/16/22064.html#Feedback</comments><slash:comments>18</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/22064.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/22064.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/mzty/archive/2007/04/16/22064.html'>阅读全文</a><img src ="http://www.cppblog.com/mzty/aggbug/22064.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2007-04-16 22:41 <a href="http://www.cppblog.com/mzty/archive/2007/04/16/22064.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WinForm的自动缩放（dialog跟随系统字体大小的自动缩放）</title><link>http://www.cppblog.com/mzty/archive/2006/11/23/15591.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Thu, 23 Nov 2006 10:57:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2006/11/23/15591.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/15591.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2006/11/23/15591.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/15591.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/15591.html</trackback:ping><description><![CDATA[一   当我们把系统的字体改为大字号的话，如果我们的Form上的text和control不跟着变大的话，那会使我们的界面很难看。但是很幸运的是在WinForm中已经提供了这个功能，使用也很方便，只需要在Form的Load事件中从新设置Form的字体为系统的字体。<br /><br />二  请看效果如下：(<font color="#ff1493">均为系统字体是特大号时</font>)<br />       修改后：<img src="http://www.cnblogs.com/images/cnblogs_com/mzty/77070/o_Form2.JPG" border="0" /><br /><br />      修改前：<img src="http://www.cnblogs.com/images/cnblogs_com/mzty/77070/o_form1.JPG" border="0" /><br />三  相关的代码1：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> System;<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> System.Collections.Generic;<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> System.ComponentModel;<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> System.Data;<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> System.Drawing;<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> System.Text;<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> System.Windows.Forms;<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000"> WinFormAutoScale<br /><img id="Codehighlighter1_193_455_Open_Image" onclick="this.style.display='none'; Codehighlighter1_193_455_Open_Text.style.display='none'; Codehighlighter1_193_455_Closed_Image.style.display='inline'; Codehighlighter1_193_455_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_193_455_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_193_455_Closed_Text.style.display='none'; Codehighlighter1_193_455_Open_Image.style.display='inline'; Codehighlighter1_193_455_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_193_455_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_193_455_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> partial </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> Form1 : Form<br /><img id="Codehighlighter1_237_453_Open_Image" onclick="this.style.display='none'; Codehighlighter1_237_453_Open_Text.style.display='none'; Codehighlighter1_237_453_Closed_Image.style.display='inline'; Codehighlighter1_237_453_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_237_453_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_237_453_Closed_Text.style.display='none'; Codehighlighter1_237_453_Open_Image.style.display='inline'; Codehighlighter1_237_453_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span id="Codehighlighter1_237_453_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_237_453_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> Form1()<br /><img id="Codehighlighter1_270_315_Open_Image" onclick="this.style.display='none'; Codehighlighter1_270_315_Open_Text.style.display='none'; Codehighlighter1_270_315_Closed_Image.style.display='inline'; Codehighlighter1_270_315_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_270_315_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_270_315_Closed_Text.style.display='none'; Codehighlighter1_270_315_Open_Image.style.display='inline'; Codehighlighter1_270_315_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span id="Codehighlighter1_270_315_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_270_315_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />            InitializeComponent();<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="COLOR: #000000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> Form1_Load(</span><span style="COLOR: #0000ff">object</span><span style="COLOR: #000000"> sender, EventArgs e)<br /><img id="Codehighlighter1_386_447_Open_Image" onclick="this.style.display='none'; Codehighlighter1_386_447_Open_Text.style.display='none'; Codehighlighter1_386_447_Closed_Image.style.display='inline'; Codehighlighter1_386_447_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_386_447_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_386_447_Closed_Text.style.display='none'; Codehighlighter1_386_447_Open_Image.style.display='inline'; Codehighlighter1_386_447_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span id="Codehighlighter1_386_447_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_386_447_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.Font </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> SystemFonts.IconTitleFont;<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="COLOR: #000000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>相关代码2：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000"> WinFormAutoScale<br /><img id="Codehighlighter1_27_2258_Open_Image" onclick="this.style.display='none'; Codehighlighter1_27_2258_Open_Text.style.display='none'; Codehighlighter1_27_2258_Closed_Image.style.display='inline'; Codehighlighter1_27_2258_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_27_2258_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_27_2258_Closed_Text.style.display='none'; Codehighlighter1_27_2258_Open_Image.style.display='inline'; Codehighlighter1_27_2258_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_27_2258_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_27_2258_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />    partial </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> Form1<br /><img id="Codehighlighter1_57_2256_Open_Image" onclick="this.style.display='none'; Codehighlighter1_57_2256_Open_Text.style.display='none'; Codehighlighter1_57_2256_Closed_Image.style.display='inline'; Codehighlighter1_57_2256_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_57_2256_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_57_2256_Closed_Text.style.display='none'; Codehighlighter1_57_2256_Open_Image.style.display='inline'; Codehighlighter1_57_2256_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span id="Codehighlighter1_57_2256_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_57_2256_Open_Text"><span style="COLOR: #000000">{<br /><img id="Codehighlighter1_67_143_Open_Image" onclick="this.style.display='none'; Codehighlighter1_67_143_Open_Text.style.display='none'; Codehighlighter1_67_143_Closed_Image.style.display='inline'; Codehighlighter1_67_143_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_67_143_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_67_143_Closed_Text.style.display='none'; Codehighlighter1_67_143_Open_Image.style.display='inline'; Codehighlighter1_67_143_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span id="Codehighlighter1_67_143_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_67_143_Open_Text"><span style="COLOR: #808080">///</span><span style="COLOR: #008000"> </span><span style="COLOR: #808080">&lt;summary&gt;</span><span style="COLOR: #008000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #808080">///</span><span style="COLOR: #008000"> Required designer variable.<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        </span><span style="COLOR: #808080">///</span><span style="COLOR: #008000"> </span><span style="COLOR: #808080">&lt;/summary&gt;</span><span style="COLOR: #808080"></span></span><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> System.ComponentModel.IContainer components </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_221_412_Open_Image" onclick="this.style.display='none'; Codehighlighter1_221_412_Open_Text.style.display='none'; Codehighlighter1_221_412_Closed_Image.style.display='inline'; Codehighlighter1_221_412_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_221_412_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_221_412_Closed_Text.style.display='none'; Codehighlighter1_221_412_Open_Image.style.display='inline'; Codehighlighter1_221_412_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span id="Codehighlighter1_221_412_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_221_412_Open_Text"><span style="COLOR: #808080">///</span><span style="COLOR: #008000"> </span><span style="COLOR: #808080">&lt;summary&gt;</span><span style="COLOR: #008000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #808080">///</span><span style="COLOR: #008000"> Clean up any resources being used.<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #808080">///</span><span style="COLOR: #008000"> </span><span style="COLOR: #808080">&lt;/summary&gt;</span><span style="COLOR: #008000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        </span><span style="COLOR: #808080">///</span><span style="COLOR: #008000"> </span><span style="COLOR: #808080">&lt;param name="disposing"&gt;</span><span style="COLOR: #008000">true if managed resources should be disposed; otherwise, false.</span><span style="COLOR: #808080">&lt;/param&gt;</span><span style="COLOR: #808080"></span></span><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">override</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> Dispose(</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000"> disposing)<br /><img id="Codehighlighter1_477_641_Open_Image" onclick="this.style.display='none'; Codehighlighter1_477_641_Open_Text.style.display='none'; Codehighlighter1_477_641_Closed_Image.style.display='inline'; Codehighlighter1_477_641_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_477_641_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_477_641_Closed_Text.style.display='none'; Codehighlighter1_477_641_Open_Image.style.display='inline'; Codehighlighter1_477_641_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span id="Codehighlighter1_477_641_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_477_641_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (disposing </span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000"> (components </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">))<br /><img id="Codehighlighter1_542_594_Open_Image" onclick="this.style.display='none'; Codehighlighter1_542_594_Open_Text.style.display='none'; Codehighlighter1_542_594_Closed_Image.style.display='inline'; Codehighlighter1_542_594_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_542_594_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_542_594_Closed_Text.style.display='none'; Codehighlighter1_542_594_Open_Image.style.display='inline'; Codehighlighter1_542_594_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />            </span><span id="Codehighlighter1_542_594_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_542_594_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />                components.Dispose();<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />            }</span></span><span style="COLOR: #000000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #0000ff">base</span><span style="COLOR: #000000">.Dispose(disposing);<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="COLOR: #000000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_652_2145_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_652_2145_Closed_Text.style.display='none'; Codehighlighter1_652_2145_Open_Image.style.display='inline'; Codehighlighter1_652_2145_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" /><img id="Codehighlighter1_652_2145_Open_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_652_2145_Open_Text.style.display='none'; Codehighlighter1_652_2145_Closed_Image.style.display='inline'; Codehighlighter1_652_2145_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />        </span><span id="Codehighlighter1_652_2145_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">Windows Form Designer generated code</span><span id="Codehighlighter1_652_2145_Open_Text" style="DISPLAY: none"><span style="COLOR: #0000ff">#region</span><span style="COLOR: #000000"> Windows Form Designer generated code</span><span style="COLOR: #000000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_706_869_Open_Image" onclick="this.style.display='none'; Codehighlighter1_706_869_Open_Text.style.display='none'; Codehighlighter1_706_869_Closed_Image.style.display='inline'; Codehighlighter1_706_869_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_706_869_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_706_869_Closed_Text.style.display='none'; Codehighlighter1_706_869_Open_Image.style.display='inline'; Codehighlighter1_706_869_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span id="Codehighlighter1_706_869_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_706_869_Open_Text"><span style="COLOR: #808080">///</span><span style="COLOR: #008000"> </span><span style="COLOR: #808080">&lt;summary&gt;</span><span style="COLOR: #008000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #808080">///</span><span style="COLOR: #008000"> Required method for Designer support - do not modify<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #808080">///</span><span style="COLOR: #008000"> the contents of this method with the code editor.<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        </span><span style="COLOR: #808080">///</span><span style="COLOR: #008000"> </span><span style="COLOR: #808080">&lt;/summary&gt;</span><span style="COLOR: #808080"></span></span><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> InitializeComponent()<br /><img id="Codehighlighter1_921_2125_Open_Image" onclick="this.style.display='none'; Codehighlighter1_921_2125_Open_Text.style.display='none'; Codehighlighter1_921_2125_Closed_Image.style.display='inline'; Codehighlighter1_921_2125_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_921_2125_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_921_2125_Closed_Text.style.display='none'; Codehighlighter1_921_2125_Open_Image.style.display='inline'; Codehighlighter1_921_2125_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span id="Codehighlighter1_921_2125_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_921_2125_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />            System.ComponentModel.ComponentResourceManager resources </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> System.ComponentModel.ComponentResourceManager(</span><span style="COLOR: #0000ff">typeof</span><span style="COLOR: #000000">(Form1));<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.label1 </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> System.Windows.Forms.Label();<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.button1 </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> System.Windows.Forms.Button();<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.SuspendLayout();<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> <br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> label1<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> </span><span style="COLOR: #008000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">            resources.ApplyResources(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.label1, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">label1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.label1.BorderStyle </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> System.Windows.Forms.BorderStyle.FixedSingle;<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.label1.Name </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">label1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> <br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> button1<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> </span><span style="COLOR: #008000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">            resources.ApplyResources(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.button1, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">button1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.button1.Name </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">button1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.button1.UseVisualStyleBackColor </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> <br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Form1<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> </span><span style="COLOR: #008000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">            resources.ApplyResources(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">$this</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.AutoScaleMode </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> System.Windows.Forms.AutoScaleMode.Font;<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.Controls.Add(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.button1);<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.Controls.Add(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.label1);<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.Name </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Form1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.Load </span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> System.EventHandler(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.Form1_Load);<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.ResumeLayout(</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">);<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.PerformLayout();<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="COLOR: #000000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        </span><span style="COLOR: #0000ff">#endregion</span></span><span style="COLOR: #000000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> System.Windows.Forms.Label label1;<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> System.Windows.Forms.Button button1;<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span></div><br />（<span style="COLOR: red">注意上面代码中的Form的AutoScaleMode属性的设置</span>）<br /><br /><br />四  求助：在MFC中的Dialog并没有提供类似的功能，要实现Dialog的自动的缩放，要使Dialog上texts和controls都随着系统的字体大小缩放，而且还不仅跟字体有关。那位有好的办法，谢谢！<br /><br /><br />五  参考：<br />         <a href="/mzty/archive/2006/11/13/15131.html"><font color="#6fbc4c">http://www.cppblog.com/mzty/archive/2006/11/13/15131.html</font></a><br /><br />         <a href="http://msdn2.microsoft.com/en-us/library/ms229605.aspx"><font color="#6fbc4c">http://msdn2.microsoft.com/en-us/library/ms229605.aspx</font></a><br /><img src ="http://www.cppblog.com/mzty/aggbug/15591.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2006-11-23 18:57 <a href="http://www.cppblog.com/mzty/archive/2006/11/23/15591.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>分别用c++,c#,vb script 来打开www.baidu.com</title><link>http://www.cppblog.com/mzty/archive/2006/09/27/13033.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Wed, 27 Sep 2006 07:59:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2006/09/27/13033.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/13033.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2006/09/27/13033.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/13033.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/13033.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 使用c＋＋：（下面是传递参数的结构） typedef&nbsp;struct&nbsp;_SHELLEXECUTEINFO&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;cbSize;&nbsp;&nbsp;&nbsp;&nbsp;ULONG&nbsp;fMask;&nbsp;&nbsp;&nbsp;&nbsp;HWND&nbsp;hwnd;&nbsp;&n...&nbsp;&nbsp;<a href='http://www.cppblog.com/mzty/archive/2006/09/27/13033.html'>阅读全文</a><img src ="http://www.cppblog.com/mzty/aggbug/13033.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2006-09-27 15:59 <a href="http://www.cppblog.com/mzty/archive/2006/09/27/13033.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++\CLI与c#</title><link>http://www.cppblog.com/mzty/archive/2006/08/17/11358.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Thu, 17 Aug 2006 08:46:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2006/08/17/11358.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/11358.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2006/08/17/11358.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/11358.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/11358.html</trackback:ping><description><![CDATA[
		<table class="data" width="80%" border="1">
				<tbody>
						<tr valign="top">
								<th class="data" align="left" width="25%">Description</th>
								<th class="data" align="left" width="37%">C++/CLI</th>
								<th class="data" align="left" width="38%">C#</th>
						</tr>
						<tr valign="top">
								<td class="data" width="25%">Allocate reference type</td>
								<td class="data" width="37%">
										<b>ReferenceType^ h = gcnew ReferenceType;</b>
								</td>
								<td class="data" width="38%">
										<b>ReferenceType h = new ReferenceType();</b>
								</td>
						</tr>
						<tr valign="top">
								<td class="data" width="25%">Allocate value type</td>
								<td class="data" width="37%">
										<b>ValueType v(3, 4);</b>
								</td>
								<td class="data" width="38%">
										<b>ValueType v = new ValueType(3, 4);</b>
								</td>
						</tr>
						<tr valign="top">
								<td class="data" width="25%">Reference type, stack semantics</td>
								<td class="data" width="37%">
										<b>ReferenceType h;</b>
								</td>
								<td class="data" width="38%">N/A</td>
						</tr>
						<tr valign="top">
								<td class="data" width="25%">Calling <b>Dispose</b> method</td>
								<td class="data" width="37%">
										<b>ReferenceType^ h = gcnew ReferenceType;</b>
										<p>
												<b>delete h;</b>
										</p>
								</td>
								<td class="data" width="38%">
										<b>ReferenceType h = new ReferenceType();</b>
										<p>
												<b>((IDisposable)h).Dispose();</b>
										</p>
								</td>
						</tr>
						<tr valign="top">
								<td class="data" width="25%">Implementing <b>Dispose</b> method</td>
								<td class="data" width="37%">
										<b>~TypeName() {}</b>
								</td>
								<td class="data" width="38%">
										<b>void IDisposable.Dispose() {}</b>
								</td>
						</tr>
						<tr valign="top">
								<td class="data" width="25%">Implementing <b>Finalize</b> method</td>
								<td class="data" width="37%">
										<b>!TypeName() {}</b>
								</td>
								<td class="data" width="38%">
										<b>~TypeName() {}</b>
								</td>
						</tr>
						<tr valign="top">
								<td class="data" width="25%">Boxing</td>
								<td class="data" width="37%">
										<b>int^ h = 123;</b>
								</td>
								<td class="data" width="38%">
										<b>object h = 123;</b>
								</td>
						</tr>
						<tr valign="top">
								<td class="data" width="25%">Unboxing</td>
								<td class="data" width="37%">
										<b>int^ hi = 123;</b>
										<p>
												<b>int c = *hi;</b>
										</p>
								</td>
								<td class="data" width="38%">
										<b>object h = 123;</b>
										<p>
												<b>int i = (int) h;</b>
										</p>
								</td>
						</tr>
						<tr valign="top">
								<td class="data" width="25%">Reference type definition</td>
								<td class="data" width="37%">
										<b>ref class ReferenceType {};</b>
										<p>
												<b>ref struct ReferenceType {};</b>
										</p>
								</td>
								<td class="data" width="38%">
										<b>class ReferenceType {}</b>
								</td>
						</tr>
						<tr valign="top">
								<td class="data" width="25%">Value type definition</td>
								<td class="data" width="37%">
										<b>value class ValueType {};</b>
										<p>
												<b>value struct ValueType {};</b>
										</p>
								</td>
								<td class="data" width="38%">
										<b>struct ValueType {}</b>
								</td>
						</tr>
						<tr valign="top">
								<td class="data" width="25%">Using properties</td>
								<td class="data" width="37%">
										<b>h.Prop = 123;</b>
										<p>
												<b>int v = h.Prop;</b>
										</p>
								</td>
								<td class="data" width="38%">
										<b>h.Prop = 123;</b>
										<p>
												<b>int v = h.Prop;</b>
										</p>
								</td>
						</tr>
						<tr valign="top">
								<td class="data" width="25%">Property definition</td>
								<td class="data" width="37%">
										<b>property String^ Name <br />{<br />    String^ get()<br />    {<br />        return m_value;<br />    }<br />    void set(String^ value)<br />    {<br />        m_value = value;<br />    }<br />}</b>
								</td>
								<td class="data" width="38%">
										<b>string Name <br />{<br />    get<br />    {<br />        return m_name;<br />    }<br />    set<br />    {<br />        m_name = value;<br />    }</b>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.cppblog.com/mzty/aggbug/11358.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2006-08-17 16:46 <a href="http://www.cppblog.com/mzty/archive/2006/08/17/11358.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Native c++ 和Managed 的 interop</title><link>http://www.cppblog.com/mzty/archive/2006/08/17/11354.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Thu, 17 Aug 2006 08:26:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2006/08/17/11354.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/11354.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2006/08/17/11354.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/11354.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/11354.html</trackback:ping><description><![CDATA[
		<p>4种方法:<br /><br />There are four main ways to do interop in .NET between the managed and native worlds. COM interop can be accomplished using Runtime Callable Wrappers (RCW) and COM Callable Wrappers (CCW). The common language runtime (CLR) is responsible for type marshaling (except in the rare scenarios where a custom marshaler is used) and the cost of these calls can be expensive. You need to be careful that the interfaces are not too chatty; otherwise a large performance penalty could result. You also need to ensure that the wrappers are kept up to date with the underlying component. That said, COM interop is very useful for simple interop scenarios where you are attempting to bring in a large amount of native COM code.</p>
		<p>The second option for interop is to use P/Invoke. This is accomplished using the DllImport attribute, specifying the attribute on the method declaration for the function you want to import. Marshaling is handled according to how it has been specified in the declaration. However, DllImport is only useful if you have code that exposes the required functions through a DLL export.</p>
		<p>When you need to call managed code from native code, CLR hosting is an option. In such a scenario, the native application has to drive all of the execution: setting up the host, binding to the runtime, starting the host, retrieving the appropriate AppDomain, setting up the invocation context, locating the desired assembly and class, and invoking the operation on the desired class. This is definitely one of the most robust solutions in terms of control over what and when things happen, but it is also incredibly tedious and requires a lot of custom code.</p>
		<p>The fourth option, and quite possibly the easiest and the most performant, is to use the interop capabilities in C++. By throwing the /clr switch, the compiler generates MSIL instead of native machine code. The only code that is generated as native machine code is code that just can't be compiled to MSIL, including functions with inline asm blocks and operations that use CPU-specific intrinsics such as Streaming SIMD Extensions (SSE). The /clr switch is how the Quake II port to .NET was accomplished. The Vertigo software team spent a day porting the original C code for the game to code that successfully compiled as C++ and then threw the /clr switch. In no time they were up and running on the .NET Framework. Without adding any additional binaries and simply by including the appropriate header files, managed C++ and native C++ can call each other without any additional work on the part of the developer. The compiler handles the creation of the appropriate thunks to go back and forth between the two worlds.</p>
<img src ="http://www.cppblog.com/mzty/aggbug/11354.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2006-08-17 16:26 <a href="http://www.cppblog.com/mzty/archive/2006/08/17/11354.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>调试breakpoint高级</title><link>http://www.cppblog.com/mzty/archive/2006/08/16/11289.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Wed, 16 Aug 2006 06:47:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2006/08/16/11289.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/11289.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2006/08/16/11289.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/11289.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/11289.html</trackback:ping><description><![CDATA[breakpoint的右键菜单:<br><img style="WIDTH: 585px; HEIGHT: 264px" height=264 alt=o_tiaoshi2.jpg src="http://www.cppblog.com/images/cppblog_com/mzty/2021/o_tiaoshi2.jpg" width=585 border=0><br><br>
<div class=itemTitleStyle><font style="BACKGROUND-COLOR: #ff1493">Tracepoints</font></div>
<div class=itemBodyStyle>
<p>When you have a "mystery" bug to solve, tracepoints are a vital part of your debugging arsenal. Single stepping and looking through code can be S-L-O-O-O-O-W and if you don't even know what you're looking for, it can consume hours and hours of effort. Tracepoints really speed things up. They're like breakpoints that don't break. In a way, they go back to the old "printf debugging" -- but you don't need to make code changes and recompile to change them.</p>
<p>To set a tracepoint, first set a breakpoint, then right-click on the red dot that appears in the margin and choose When Hit:</p>
<p><img src="http://www.gregcons.com/KateBlog/content/binary/tracepoint1.gif" border=0></p>
<p>In the dialog that appears, click the Print A Message box and edit the starter message you are given. You can include any expression in braces and it will be evaluated when control reaches the tracepoint:</p>
<p><img src="http://www.gregcons.com/KateBlog/content/binary/tracepoint2.gif" border=0></p>
<p>Leave the Continue Execution box checked so that you don't break. Tracepoints are identified by red diamonds instead of red dots:</p>
<p><img src="http://www.gregcons.com/KateBlog/content/binary/tracepoint3.gif" border=0></p>
<p>The output from the tracepoints appears in the output window of your debug session:</p>
<p><img style="WIDTH: 554px; HEIGHT: 126px" height=126 src="http://www.gregcons.com/KateBlog/content/binary/tracepoint4.gif" width=554 border=0></p>
<p>You can set up something suspicious, let it run, then pore through the tracepoint output and see what you learn. It's a huge timesaver when you're tackling a "we don't even know where to start" bug. Plus, if the issue is related to threading or async issues in any way (and you know me, I keep preaching we will all be facing async issues eventually) then you don't have to worry that pausing execution suppresses the collisions. I recently helped a client solve a big hairy this-stuff-fails-for-our-biggest-customer-only bug using tracepoints... and a few other tricks I will cover in upcoming posts.</p>
<div class=itemTitleStyle><font style="BACKGROUND-COLOR: #ff1493">Conditional breakpoints</font></div>
<div class=itemBodyStyle>
<p>Conditional breakpoints were another really important tool in solving a recent "only happens at the big installations" bug in a big and complicated C++ application. We wanted to debug the code with as few rebuilds as possible and we really didn't know how parts of it worked at all. <a href="http://www.gregcons.com/KateBlog/ct.ashx?id=eb64dfe1-fde4-413e-be11-2445b3f7d5e1&amp;url=http%3a%2f%2fwww.gregcons.com%2fKateBlog%2fCommentView.aspx%3fguid%3dc5590e77-c53e-4a2a-a632-80e10fe611bb" ?=""><strong><font color=#004183>Tracepoints </font></strong></a>helped us to figure out a lot of it in a short time. We didn't have a decent repro case though, so here's what we did:</p>
<ul>
    <li>created a script to add an audit table and some triggers that write to it
    <li>created a script to remove those triggers and the table
    <li>created a batch file to run a server in verbose mode, and redirect the output to a text file (remembering DOS commands sure can be helpful...&nbsp;&nbsp; <strong>myapp.exe -verbose &gt;logfile.txt</strong> was the magic phrase.)
    <li>wrote some instructions for the support guy to grab a backup of the database, run the first script, run the batch file, let it run all night, then in the morning grab another backup of the database, run the second script, and stop the batch file.</li>
</ul>
<p>Now we ran some queries on the morning version of the database to confirm that at least one X was missing a Y that should have been calculated overnight. We even had the Xid. Thanks to the tracepoint work of the previous day we knew where to be suspicious. A little digging in the trigger output told us whether the problem was "didn't get added" or "got added, but then got deleted". The last step was conditional breakpoints. These let us say "only stop here when you're processing the X with this Xid." </p>
<p><img src="http://www.gregcons.com/KateBlog/content/binary/condbreakpoint.gif" border=0></p>
<p>This really saves time when you just need to drill into what's happening in the case that is going wrong. You get to it by right clicking the red dot or diamond and choosing Condition. </p>
<br>
<div class=itemTitleStyle><font style="BACKGROUND-COLOR: #ff1493">One more breakpoint tip - hit count</font></div>
<div class=itemBodyStyle>
<p><a href="http://www.gregcons.com/KateBlog/ct.ashx?id=d9e91a84-e206-4e03-b21f-b38fcf70b138&amp;url=http%3a%2f%2fwww.gregcons.com%2fKateBlog%2fCommentView.aspx%3fguid%3deb64dfe1-fde4-413e-be11-2445b3f7d5e1" ?=""><strong><font color=#005bba>Conditional breakpoints</font></strong></a> are cool when you know the value of one variable that is associated with trouble: this only blows up&nbsp;when Xid&nbsp;is 1234. They can also be used to reduce the boredom of single stepping. Say you've got some loop that goes around a few hundred times building up some string or array or something. You don't want to keep going round and round and round... it would be nice to jump ahead to halfway through, for example, and see how things are looking. Now if this is a for loop with a handy named variable, say</p>
<p>&#160;</p>
<pre>for (int i = 0; i&lt;1000; i++)</pre>
<p>&#160;</p>
<p>Then you can use a conditional breakpoint and say "stop when i is 200". Or you could be clever and stop when <strong>i % 200 </strong>is 0 -- so that's every 200 times. But what if there's no i? What if you're going through a file or a recordset/dataset/resultset and you're going until the end? You don't want to add some fake variable that gets incremented each time through the loop, just so you can set a breakpoint that breaks on certain values of that variable. Instead you want to use the hit count property of the breakpoint. Just right click the red dot and choose Hit Count. There you can set the breakpoint to break whenever it's hit, just the 10th time it's hit, every tenth time (10, 20, 30 etc) or every time after the 10th time Or, of course, whatever number you want instead of 10:</p>
<p><img src="http://www.gregcons.com/KateBlog/content/binary/hitcount.gif" border=0></p>
<p>Don't debug the slow way when there are tools to make you so much faster!<br><br><font style="BACKGROUND-COLOR: #ff1493">Filter</font>&nbsp;&nbsp; 下次再介绍:<br><br><img height=336 alt=o_tiaoshi.jpg src="http://www.cppblog.com/images/cppblog_com/mzty/2021/o_tiaoshi.jpg" width=406 border=0><br><br><br><font style="BACKGROUND-COLOR: #ee82ee">注意:c#的也可以用的啊....<br><br><br><br>来自:http://www.gregcons.com/KateBlog/CategoryView.aspx?category=C%2B%2B<br></font></p>
</div>
</div>
</div><img src ="http://www.cppblog.com/mzty/aggbug/11289.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2006-08-16 14:47 <a href="http://www.cppblog.com/mzty/archive/2006/08/16/11289.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TestRunner</title><link>http://www.cppblog.com/mzty/archive/2006/07/29/10675.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Sat, 29 Jul 2006 05:31:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2006/07/29/10675.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/10675.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2006/07/29/10675.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/10675.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/10675.html</trackback:ping><description><![CDATA[
		<h2>testrunner</h2>
		<p>
				<a href="http://morningspace.51.net/resource/cppunit/textui.html">
				</a> </p>
		<h2>
				<a href="http://www.mailframe.net/Products/TestRunner/default.aspx">http://www.mailframe.net/Products/TestRunner/default.aspx</a>
		</h2>
		<h2>TestRunner Provides </h2>
		<ul>
				<li>Test Driven Development inside Visual Studio 2005 
</li>
				<li>Integrated debugging from a simple context menu in the editor 
</li>
				<li>File, method, and line level code coverage in the editor 
</li>
				<li>Graphical test feedback directly in the Visual Studio editor 
</li>
				<li>Console &amp; Trace redirection to the Output Window 
</li>
				<li>Non-blocking test runs -- program while you test on a background thread 
</li>
				<li>Test failure tool tips and line markers 
</li>
				<li>Ultra Performance tested with suites of 1400 unit tests </li>
		</ul>
		<p> </p>
		<ul>
				<li>TestRunner will change the way you NUnit test by making it a seamless experience with programming. Tests run in the background and richly interact with the Visual Studio editor instead of a separate program, saving you from the window shuffle or losing your place in your code. <span class="hot">Unit testing</span>, <span class="hot">code coverage</span>, and now <span class="hot">performance profiling</span> all in one convenient tool. </li>
		</ul>
		<p>cppunit:   <a href="http://morningspace.51.net/resource/cppunit/textui.html">http://morningspace.51.net/resource/cppunit/textui.html</a><br /> </p>
		<p>------------------------------------------------------------------------------------------------------------------------------------<br /></p>
		<div class="postText">TestDriven.NET网址：<a href="http://www.testdriven.net/">http://www.testdriven.net/</a><br />下载地址：<a href="http://www.testdriven.net/Default.aspx?tabid=27">http://www.testdriven.net/Default.aspx?tabid=27</a><br />博客园下载地址：<a href="http://downloads.cnblogs.com/TestDriven.NET-1.0.915d.zip">http://downloads.cnblogs.com/TestDriven.NET-1.0.915d.zip</a><br />使用帮助：<a href="http://www.testdriven.net/Default.aspx?tabid=29">http://www.testdriven.net/Default.aspx?tabid=29</a><br /><br />使用感受： <br />1、与VS.NET集成得很不错, 使用起来很方便, 比如我们运行一个测试方法，直接在这个方法上点击右键Run Test(s): <br /><img height="250" hspace="5" src="http://www.cnblogs.com/images/cnblogs_com/dudu/testdivern001.gif" width="483" align="baseline" /><br />然后在VS.NET的输出窗口中输出测试结果。Cool! 错误信息会显示在任务窗口。 <br />2、在“解决方案资源管理器”中，可以选中相应的项目点击右键运行测试，可以通过Test With NUnit GUI启动NUnit GUI运行测试。 <br />3、通过Tests With Debugger, 在Debug模式中运行测试， <br />4、不需要另外安装NUnit。TestDriven.NET已经自带NUnit。<br /><br />------------------------------------------------------------------<br /><br />nunit的使用:<br /><br /><a href="http://ltp.cnblogs.com/archive/2005/12/03/289720.html">http://ltp.cnblogs.com/archive/2005/12/03/289720.html</a></div>
<img src ="http://www.cppblog.com/mzty/aggbug/10675.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2006-07-29 13:31 <a href="http://www.cppblog.com/mzty/archive/2006/07/29/10675.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>保护你的DLL和Code不被别人使用</title><link>http://www.cppblog.com/mzty/archive/2006/07/24/10389.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Mon, 24 Jul 2006 01:12:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2006/07/24/10389.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/10389.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2006/07/24/10389.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/10389.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/10389.html</trackback:ping><description><![CDATA[ 大家做项目开发一般都是分层的，比如UI层，业务层，数据访问层。业务层引用数据访问层的DLL(比如dataAccess.dll)，并使用dataAccess.dll中的方法。当项目完成并给客户用了，可有些心里BT的客户这个时候也可以请个稍微懂NET的人来引用你的dataAccess.dll并调用其中的方法搞破坏。比如可以直接使用里面的ChangePwd(string UserName,string Pwd)方法把其他用户的密码改了，这个时候就你就.......<br /><br />       好了，该开始说怎么保护我们的代码了：<br /><br />首先我们需要把我们的程序集做成强命名的程序集。<br /><br />这里我们在.NET 命令提示中输入sn -k c:\test.snk 创建一个新的随机密钥对并将其存储在 <font face="Times New Roman"><code class="ce">c:\test.snk </code>中<br /><br />然后新建立类库ClassLibrary1，里面只有个类文件Class1.cs，代码如下：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080"> 1</span><img src="http://bearstar.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> System;<br /></span><span style="COLOR: #008080"> 2</span><span style="COLOR: #000000"><img src="http://bearstar.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #000000"><img src="http://bearstar.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000"> ClassLibrary1<br /></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #000000"><img id="Codehighlighter1_39_180_Open_Image" onclick="this.style.display='none'; Codehighlighter1_39_180_Open_Text.style.display='none'; Codehighlighter1_39_180_Closed_Image.style.display='inline'; Codehighlighter1_39_180_Closed_Text.style.display='inline';" src="http://bearstar.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_39_180_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_39_180_Closed_Text.style.display='none'; Codehighlighter1_39_180_Open_Image.style.display='inline'; Codehighlighter1_39_180_Open_Text.style.display='inline';" src="http://bearstar.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_39_180_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_39_180_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080"> 5</span><span style="COLOR: #000000"><img src="http://bearstar.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> Class1<br /></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #000000"><img id="Codehighlighter1_63_178_Open_Image" onclick="this.style.display='none'; Codehighlighter1_63_178_Open_Text.style.display='none'; Codehighlighter1_63_178_Closed_Image.style.display='inline'; Codehighlighter1_63_178_Closed_Text.style.display='inline';" src="http://bearstar.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_63_178_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_63_178_Closed_Text.style.display='none'; Codehighlighter1_63_178_Open_Image.style.display='inline'; Codehighlighter1_63_178_Open_Text.style.display='inline';" src="http://bearstar.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span id="Codehighlighter1_63_178_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_63_178_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #000000"><img src="http://bearstar.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> Class1()<br /></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #000000"><img id="Codehighlighter1_85_125_Open_Image" onclick="this.style.display='none'; Codehighlighter1_85_125_Open_Text.style.display='none'; Codehighlighter1_85_125_Closed_Image.style.display='inline'; Codehighlighter1_85_125_Closed_Text.style.display='inline';" src="http://bearstar.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_85_125_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_85_125_Closed_Text.style.display='none'; Codehighlighter1_85_125_Open_Image.style.display='inline'; Codehighlighter1_85_125_Open_Text.style.display='inline';" src="http://bearstar.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span id="Codehighlighter1_85_125_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_85_125_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #000000"><img src="http://bearstar.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">10</span><span style="COLOR: #008000"><img src="http://bearstar.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> TODO: 在此处添加构造函数逻辑<br /></span><span style="COLOR: #008080">11</span><span style="COLOR: #008000"><img src="http://bearstar.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #008000">//<br /></span><span style="COLOR: #008080">12</span><span style="COLOR: #008000"><img src="http://bearstar.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /></span><span style="COLOR: #000000">        }</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://bearstar.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br /></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://bearstar.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000"> Insert()<br /></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img id="Codehighlighter1_155_175_Open_Image" onclick="this.style.display='none'; Codehighlighter1_155_175_Open_Text.style.display='none'; Codehighlighter1_155_175_Closed_Image.style.display='inline'; Codehighlighter1_155_175_Closed_Text.style.display='inline';" src="http://bearstar.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_155_175_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_155_175_Closed_Text.style.display='none'; Codehighlighter1_155_175_Open_Image.style.display='inline'; Codehighlighter1_155_175_Open_Text.style.display='inline';" src="http://bearstar.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span id="Codehighlighter1_155_175_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_155_175_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://bearstar.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ok</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img src="http://bearstar.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img src="http://bearstar.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img src="http://bearstar.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">20</span><span style="COLOR: #000000"><img src="http://bearstar.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span></div><br />AssemblyInfo.cs代码：<br />//............其他的就用默认<br />[assembly: AssemblyKeyFile("c:\\test.snk")]   // 连接上面用强命名工具SN.exe生成的文件.<br /><br />接着创建个WindowApplication来调用我们的ClassLibrary1，代码：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> button1_Click(</span><span style="COLOR: #0000ff">object</span><span style="COLOR: #000000"> sender, System.EventArgs e)<br />{<br />    MessageBox.Show(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ClassLibrary1.Class1().Insert());<br />}</span></div></font>不修改WindowApplication的AssemblyInfo.cs。<br />在这里就可以直接运行了，不过大家都看的出来，这样是能成功调用Class1中的方法的。<br /><br />现在让我们来修改下Class1.cs，代码：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> System;<br /></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> System.Security.Permissions;<br /><br /><br /></span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000"> ClassLibrary1<br />{<br />    [StrongNameIdentityPermissionAttribute(SecurityAction.LinkDemand, PublicKey </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> <br />         </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">00240000048000009400000006020000002400005253413100040000010001000551684edd1600</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"><br />         </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">8ccbdd337b1cf1490490d97fe0048c5f3629cc4f5104578499eace9b2a94115022edd620def472</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"><br />         </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">8b4f088291cfa77a40659afba611fdafbb7894b93a64049d439936bd0cd8dc0704625aeb735892</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"><br />         </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">e9eb3f910a49a2925af10515d935654d7adac5567ff6d780d23d587de0ff4d271da7b30680fa88</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"><br />         </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">a47a4ba4</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)]<br />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> Class1<br />    {<br />        </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> Class1()<br />        {<br />            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"><br />            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> TODO: 在此处添加构造函数逻辑<br />            </span><span style="COLOR: #008000">//<br /></span><span style="COLOR: #000000">        }<br /><br />        </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000"> Insert()<br />        {<br />            </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ok</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br />        }<br />    }<br />}<br /></span></div><p>然后再编译后运行windowapplication调用class1中的方法就会出错。<br /><br /><br /><br /><br />这里的StrongNameIdentityPermissionAttribute是NET提供的CAS(Code Access Security)中的1个类，具体可参考MSDN，<font face="Courier New">SecurityAction.LinkDemand</font> 是要求直接调用方已被授予了指定的权限，这里即windowapplication要授予了权限才行，如果使用<font face="Courier New">SecurityAction.</font><font face="Times New Roman"><strong>Demand</strong>要求调用堆栈中的所有高级调用方都已被授予了当前权限对象所指定的权限。他们的区别是：如果windowapplication已授权访问，而还有个windowapplication2(未授权访问)通过调用windowapplication中的button1_Click方法来调用class1，这个时候如果使用</font><font face="Courier New">SecurityAction.LinkDemand就能成功调用，而使用SecurityAction.<font face="Times New Roman"><strong>Demand  </strong>windowapplication2就不能调用，windowapplication 在这2种情况下都能调用。<br /><br />说到这里大家一定再问PublicKey＝后面一串那么长的字符串怎么来。PublicKey后面的字符串是你开始生成的c:\test.snk文件中保存的公钥。那怎么才能看到这个公钥了，照样是用SN.EXE。<br /><br />输入sn -p c:\test.snk  c:\publicKey.snk (从 <code class="ce"><font face="Times New Roman">test</font>.snk</code> 中提取公钥并将其存储在 <code class="ce">publicKey.snk</code> 中)<br /><br />再输入sn -tp c:\publicKey.snk (显示公钥信息)<br />上面这个命令就能看到PublicKey后面的字符串了，还想什么啊，把那字符串copy下来啊。<br /><br />最后大家一定在关心这个时候windowapplication 要怎么调用class1了，其实也简单，只要把windowapplication 的AssemblyInfo.cs修改为：<br />[assembly: AssemblyKeyFile("c:\\test.snk")]<br /><br />到这里就一切OK了，大家都看到最关键的就是test.snk文件了，所以一定要保护好你自己的test.snk文件。<br /><br />下面是我的代码，大家可以下载看看，在使用的时候记的要把我KEY文件夹下的test.snk copy到c盘。<br />不然会出错^_^。</font></font></p><img src ="http://www.cppblog.com/mzty/aggbug/10389.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2006-07-24 09:12 <a href="http://www.cppblog.com/mzty/archive/2006/07/24/10389.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Active Directory如何用Ｃ#进行增加、删除、修改、查询用户与组织单位！</title><link>http://www.cppblog.com/mzty/archive/2006/07/24/10388.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Mon, 24 Jul 2006 01:06:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2006/07/24/10388.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/10388.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2006/07/24/10388.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/10388.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/10388.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="0" width="650" align="center" bgcolor="#ffffff" border="0">
				<tbody>
						<tr>
								<td>
										<table cellspacing="0" cellpadding="0" width="100%" border="0">
												<tbody>
														<tr>
																<td>
																		<table cellspacing="0" cellpadding="0" width="100%" border="0">
																				<tbody>
																						<tr>
																								<td valign="center" bgcolor="#82949c" height="12">
																										<span style="FONT-SIZE: 14pt; COLOR: white"> </span>
																								</td>
																								<td valign="center" align="right" bgcolor="#82949c" height="12">
																								</td>
																						</tr>
																						<tr>
																								<td colspan="2">
																										<table style="BORDER-RIGHT: 1px solid; BORDER-TOP: 1px solid; BORDER-LEFT: 1px solid; BORDER-BOTTOM: 0px solid" bordercolor="#006699" cellspacing="0" cellpadding="0" width="100%">
																												<tbody>
																														<tr>
																																<td>
																																</td>
																														</tr>
																														<tr>
																																<td valign="top">
																																		<p align="center"> </p>
																																		<div id="main">
																																				<table id="documentlisttable" cellspacing="0" cellpadding="0" width="95%" align="center" border="0">
																																						<tbody>
																																								<tr>
																																										<td>
																																												<div class="post">
																																														<h3>
																																																<center>Active Directory如何用Ｃ#进行增加、删除、修改、查询用户与组织单位！</center>
																																														</h3>
																																														<div style="MARGIN: 12px">首先我们来了解一下什么是Active Directory。不用我描述，看以下网址，或在.net自带帮助文档里根据Active Directory关键字一搜，就什么都明白了。 <br />http://developer.ccidnet.com/pub/article/c322_a28703_p2.html <br /><br />接下来，我们来看看权限。你可以通过“网上邻居--整个网络--Directory--demain(你的域名)”你就可以看到所有关于域下的信息，粗一看就知道是怎么回事了。 <br />需要告诉大家的：所有组织单位下的用户都在Users(容器)--Demain Users(组)中 <br />用代码进行访问时，如果你是域管理员用户，则可以做任何操作，否则，只能查询用户属性。 <br /><br />private void SearchUser() <br />{ <br />string domainName = "Domain"; <br />string groupName = "Domain Users"; <br />string dirmemName=""; <br />//在Domain Users域用户里取得每个用户名 <br />System.DirectoryServices.DirectoryEntry group = new System.DirectoryServices.DirectoryEntry("WinNT://" + domainName + "/" + groupName + ",group"); <br />foreach(Object member in (IEnumerable)group.Invoke("Members")) <br />{ <br />//根据很个用户生成如："LDAP://OU=套装软体课,OU=系统开发部,OU=资讯服务处,OU=营运支援中心,OU=XX公司,DC=Domain,DC=com,DC=cn" <br />System.DirectoryServices.DirectoryEntry dirmem = new System.DirectoryServices.DirectoryEntry(member); <br />dirmemName=dirmem.Name; <br />string DomainName="Domain"; <br />string FilterStr = "(sAMAccountname="+dirmemName+")"; <br />System.DirectoryServices.DirectorySearcher FindMe = new System.DirectoryServices.DirectorySearcher(DomainName); <br />FindMe.Filter = FilterStr; <br />System.DirectoryServices.SearchResult FindRes = FindMe.FindOne(); <br />System.DirectoryServices.DirectoryEntry MyUser = FindRes.GetDirectoryEntry(); <br />string OUPath=MyUser.Parent.Path; <br />//找到该用户所在的LDAP:后，由域管理员登录，并取得该用户的所在属性。 <br />string strFieldsValue="",strFields=""; <br />System.DirectoryServices.DirectoryEntry myds=new System.DirectoryServices.DirectoryEntry(OUPath,"域管理员名","域管理员密码"); <br />foreach(System.DirectoryServices.DirectoryEntry tempEntry in myds.Children) <br />{ <br />if(tempEntry.SchemaClassName.ToString() == "user" &amp;&amp; tempEntry.Properties["sAMAccountName"].Value.ToString().ToLower()==dirmemName) <br />{ <br />foreach (string propertyName in tempEntry.Properties.PropertyNames ) <br />{ <br />string oneNode = propertyName + ": " + <br />entry.Properties[propertyName][0].ToString(); <br />this.Textbox1.Text=oneNode; <br />} <br />} <br /><br /><br /><br /><br /><br /><hr /><br />public void AddUser(string strPath,string Username,string ChineseName)//strPath 增加用户至哪个组织单位如"LDAP://OU=XX公司,DC=Domain,DC=com"帐号、中文名{ <br />try <br />{ <br />string RootDSE; <br />//System.DirectoryServices.DirectorySearcher DSESearcher= new System.DirectoryServices.DirectorySearcher(); <br />//RootDSE=DSESearcher.SearchRoot.Path; <br />//RootDSE="LDAP://DC=Domain,DC=com"; <br />//RootDSE=RootDSE.Insert(7,"CN=Users,"); <br />System.DirectoryServices.DirectoryEntry myDE = new System.DirectoryServices.DirectoryEntry(strPath); <br />System.DirectoryServices.DirectoryEntries myEntries = myDE.Children; <br />// Create a new entry 'Sample' in the container. <br />string strname="CN="+ChineseName; <br />System.DirectoryServices.DirectoryEntry myDirectoryEntry = myEntries.Add(strname, "user"); <br /><br />//MessageBox.Show(myDirectoryEntry.SchemaClassName.ToString()); <br />myDirectoryEntry.Properties["userPrincipalName"].Value=Username; <br />myDirectoryEntry.Properties["name"].Value=ChineseName; <br />myDirectoryEntry.Properties["samAccountName"].Value=Username; <br />myDirectoryEntry.Properties["userAccountControl"].Value =66048; //590336; <br />myDirectoryEntry.CommitChanges(); <br />} <br /><br /><hr /><br />private void addOU(string strPath,string OUName)//增加组织到strPath组织单位下，组织名称 <br />{ <br />try <br />{ <br />//String RootDSE; <br />//System.DirectoryServices.DirectorySearcher DSESearcher= new System.DirectoryServices.DirectorySearcher(); <br />//RootDSE=DSESearcher.SearchRoot.Path; <br />//RootDSE="LDAP://OU=百意时尚广场,DC=Domain,DC=com"; <br /><br />System.DirectoryServices.DirectoryEntry myDE = new System.DirectoryServices.DirectoryEntry(strPath); <br />System.DirectoryServices.DirectoryEntries myEntries = myDE.Children; <br />string name="OU="+OUName; <br />System.DirectoryServices.DirectoryEntry myDirectoryEntry = myEntries.Add(name,"organizationalUnit"); <br /><br />myDirectoryEntry.Properties["name"].Value=OUName; <br />myDirectoryEntry.Properties["instanceType"].Value=4; <br />myDirectoryEntry.Properties["distinguishedName"].Value="OU="+OUName+",DC=Domain,DC=COM)"; <br />myDirectoryEntry.Properties["objectCategory"].Value="CN=Organizational-Unit,CN=Schema,CN=Configuration,DC=sedep,DC=COM"; <br />myDirectoryEntry.Properties["ou"].Value=OUName; <br />myDirectoryEntry.Properties["postalCode"].Value="777"; <br /><br />myDirectoryEntry.CommitChanges(); <br />//UserMoveto("LDAP://OU="+OUName+",DC=sedep,DC=com",strPath); <br />} <br />catch(Exception RaiseErr) <br />{ <br />MessageBox.Show (RaiseErr.Message); <br />} <br />} <br /><br /><hr /><br />private void ModifyUser() <br />{ <br />try <br />{ <br />string DomainName="Domain"; <br />string FilterStr = "(sAMAccountname=karlluo)"; <br />System.DirectoryServices.DirectorySearcher FindMe = new System.DirectoryServices.DirectorySearcher(DomainName); <br />FindMe.Filter = FilterStr; <br />System.DirectoryServices.SearchResult FindRes = FindMe.FindOne(); <br />string tt=FindRes.Path; <br />System.DirectoryServices.DirectoryEntry MyUser = FindRes.GetDirectoryEntry(); <br />string OUPath=MyUser.Parent.Path; <br /><br />DirectoryEntry myds=new DirectoryEntry(OUPath,"域管理员名","域管理员密码"); <br /><br />foreach(System.DirectoryServices.DirectoryEntry tempEntry in myds.Children) <br />{ <br />if(tempEntry.SchemaClassName.ToString() == "user") <br />{ <br />if(tempEntry.Properties["sAMAccountName"].Value.ToString().ToLower()=="karlluo") <br />{ <br />tempEntry.UsePropertyCache=true; <br />tempEntry.Properties["st"].Value="yyyyyyyyyyyyyyyy"; <br />//newEntry.Properties["userPrincipalName"].Value="userID"; <br />tempEntry.CommitChanges(); <br />} <br />} <br />} <br />} <br />catch(Exception RaiseErr) <br />{ <br />MessageBox.Show (RaiseErr.Message); <br />} <br /><br />} <br /><img height="1" src="http://weiweictgu.cnblogs.com/aggbug/449932.html" width="1" /><br /><br /><div align="right"><font style="FONT-SIZE: 9pt"></font> </div></div>
																																												</div>
																																										</td>
																																								</tr>
																																						</tbody>
																																				</table>
																																		</div>
																																</td>
																														</tr>
																												</tbody>
																										</table>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
														<tr>
																<td bgcolor="#82949c" colspan="2">
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
						<tr>
								<td>
										<table style="BORDER-RIGHT: 1px solid; BORDER-LEFT: 1px solid" bordercolor="#006699" cellspacing="2" cellpadding="2" width="100%" bgcolor="#e2e2e2">
												<tbody>
														<tr align="middle" height="20">
																<td valign="center">
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
						<tr>
								<td>
										<table style="BORDER-RIGHT: 1px solid; BORDER-LEFT: 1px solid" bordercolor="#006699" cellspacing="0" cellpadding="0" width="100%" bgcolor="#006699">
												<tbody>
														<tr>
																<td align="middle">
																		<font color="white" size="1">Copyright © 2006 <font onclick="javascript:window.open('http://www.UROK.cn/');">www.urok.cn</font> AND <font onclick="javascript:window.open('http://shop33266099.taobao.com/');">shop33266099.taobao.com</font>, All Rights Reserved.</font>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.cppblog.com/mzty/aggbug/10388.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2006-07-24 09:06 <a href="http://www.cppblog.com/mzty/archive/2006/07/24/10388.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>.net下汉字字符串,一般字符串,时间日期的常用方法</title><link>http://www.cppblog.com/mzty/archive/2006/07/24/10387.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Mon, 24 Jul 2006 01:00:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2006/07/24/10387.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/10387.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2006/07/24/10387.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/10387.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/10387.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: //				获得汉字的区位码																								　　				byte				[] array 				=				 				new				 				byte				[				2				];　　array 				=				 System.Text.Encoding.Default.GetBytes(...&nbsp;&nbsp;<a href='http://www.cppblog.com/mzty/archive/2006/07/24/10387.html'>阅读全文</a><img src ="http://www.cppblog.com/mzty/aggbug/10387.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2006-07-24 09:00 <a href="http://www.cppblog.com/mzty/archive/2006/07/24/10387.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>vb.net与c#转换工具,资源管理工具(free)</title><link>http://www.cppblog.com/mzty/archive/2006/07/04/9357.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Tue, 04 Jul 2006 00:48:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2006/07/04/9357.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/9357.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2006/07/04/9357.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/9357.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/9357.html</trackback:ping><description><![CDATA[代码转换工具:<br /><table cellspacing="2" cellpadding="2" width="100%" border="0"><tbody><tr><td>An useful developer's utility that allows users to Convert C# to VB.NET. You can also utilize our regular expression tester and online dictionary. A standalone tool that does not require installation. </td></tr></tbody></table><a href="http://babelfish.altavista.com/babelfish/trurl_pagecontent?url=http%3A//codelib.threeus.com/Convert.htm&amp;lp=zt_en">http://babelfish.altavista.com/babelfish/trurl_pagecontent?url=http%3A//codelib.threeus.com/Convert.htm&amp;lp=zt_en</a><br /><br /><br />资源管理工具:<br /><table cellspacing="2" cellpadding="2" width="100%" border="0"><tbody><tr><td>A utility to easily refresh embedded graphic resources in a .NET assembly. A standalone tool that does not require installation.<br /><br /><a href="http://babelfish.altavista.com/babelfish/trurl_pagecontent?url=http%3A//codelib.threeus.com/Convert.htm&amp;lp=zt_en">http://babelfish.altavista.com/babelfish/trurl_pagecontent?url=http%3A//codelib.threeus.com/Convert.htm&amp;lp=zt_en</a></td></tr></tbody></table><img src ="http://www.cppblog.com/mzty/aggbug/9357.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2006-07-04 08:48 <a href="http://www.cppblog.com/mzty/archive/2006/07/04/9357.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用API实现1/1000秒的性能测试类</title><link>http://www.cppblog.com/mzty/archive/2006/06/16/8636.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Fri, 16 Jun 2006 06:07:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2006/06/16/8636.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/8636.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2006/06/16/8636.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/8636.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/8636.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: //				 MbUnit Test Framework				//				 				//				 Copyright (c) 2004 Jonathan de Halleux				//																								//				 This software is provided 'as-is', without any expr...&nbsp;&nbsp;<a href='http://www.cppblog.com/mzty/archive/2006/06/16/8636.html'>阅读全文</a><img src ="http://www.cppblog.com/mzty/aggbug/8636.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2006-06-16 14:07 <a href="http://www.cppblog.com/mzty/archive/2006/06/16/8636.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Visual Studio 2005 Team System：构建健壮而可靠的软件</title><link>http://www.cppblog.com/mzty/archive/2006/06/16/8630.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Fri, 16 Jun 2006 04:16:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2006/06/16/8630.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/8630.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2006/06/16/8630.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/8630.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/8630.html</trackback:ping><description><![CDATA[
		<h1>Visual Studio 2005 Team System：构建健壮而可靠的软件</h1>
		<h2 class="subtitle">
		</h2>
		<div class="date">发布日期： 6/21/2005<span class="datePipe"> | </span>更新日期： 6/21/2005</div>
		<div class="overview">
				<p>Kamran Iqbal<br />Microsoft Corporation</p>
				<p>适用于：</p>
				<p>Microsoft Visual Studio® 2005 Team System</p>
				<p>
						<b>摘要：</b>描述 Visual Studio 2005 Team System 提供的代码分析和性能工具。</p>
				<p>
						<b>注</b> 本文档于产品投入生产之前编写，因此您可能会发现这里所包含的细节与发布的产品有不一致的地方。文中的信息均依据撰写本文时的产品状况，仅供您在规划时参考。如有更改，恕不另行通知。Microsoft 拥有本文档中的主题所涉及的专利、专利应用程序、商标、版权或其他的知识产权。除非 Microsoft 以任何书面许可协议明确提供，向您提供本文档并没给予您使用这些专利、商标、版权或其他知识产权的任何许可证。</p>
		</div>
		<center>
				<img title="" height="6" alt="*" src="http://img.microsoft.com/library/gallery/templates/MNP2.Common/images/3squares.gif" width="30" border="0" />
		</center>
		<div style="HEIGHT: 18px">
		</div>
		<h5 style="PADDING-TOP: 2px">本页内容</h5>
		<table style="MARGIN-TOP: 7px; MARGIN-BOTTOM: 12px" cellspacing="0" cellpadding="0" border="0">
				<tbody>
						<tr valign="top">
								<td>
										<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/dnvsentvstsdev.mspx#EDC">
												<img height="9" alt="简介" hspace="4" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width="7" vspace="2" border="0" />
										</a>
								</td>
								<td class="onThisPage">
										<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/dnvsentvstsdev.mspx#EDC">简介</a>
								</td>
						</tr>
						<tr valign="top">
								<td>
										<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/dnvsentvstsdev.mspx#EGC">
												<img height="9" alt="分析工具支持" hspace="4" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width="7" vspace="2" border="0" />
										</a>
								</td>
								<td class="onThisPage">
										<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/dnvsentvstsdev.mspx#EGC">分析工具支持</a>
								</td>
						</tr>
						<tr valign="top">
								<td>
										<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/dnvsentvstsdev.mspx#ETC">
												<img height="9" alt="我们的解决方案" hspace="4" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width="7" vspace="2" border="0" />
										</a>
								</td>
								<td class="onThisPage">
										<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/dnvsentvstsdev.mspx#ETC">我们的解决方案</a>
								</td>
						</tr>
						<tr valign="top">
								<td>
										<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/dnvsentvstsdev.mspx#E5C">
												<img height="9" alt="Visual Studio 中的工具集成" hspace="4" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width="7" vspace="2" border="0" />
										</a>
								</td>
								<td class="onThisPage">
										<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/dnvsentvstsdev.mspx#E5C">Visual Studio 中的工具集成</a>
								</td>
						</tr>
						<tr valign="top">
								<td>
										<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/dnvsentvstsdev.mspx#E1GAC">
												<img height="9" alt="小结" hspace="4" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width="7" vspace="2" border="0" />
										</a>
								</td>
								<td class="onThisPage">
										<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/dnvsentvstsdev.mspx#E1GAC">小结</a>
								</td>
						</tr>
				</tbody>
		</table>
		<a name="EDC">
		</a>
		<h2>简介</h2>
		<p>要开发健壮而可靠的软件，开发人员需要一套集成分析工具，来帮助他们在开发的早期检测代码缺陷和性能问题。</p>
		<div style="MARGIN-TOP: 3px; MARGIN-BOTTOM: 10px">
				<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/dnvsentvstsdev.mspx#top">
						<img height="9" alt="返回页首" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width="7" border="0" />
				</a>
				<a class="topOfPage" href="http://www.microsoft.com/china/msdn/library/langtool/vsts/dnvsentvstsdev.mspx#top">返回页首</a>
		</div>
		<a name="EGC">
		</a>
		<h2>分析工具支持</h2>
		<p>过去，由于 Visual Studio 中缺少对代码分析的支持，因此开发人员不得不购买第三方工具，构建自定义分析工具，或者发布未经分析的代码。 </p>
		<table cellspacing="0" cellpadding="0" border="0">
				<tbody>
						<tr>
								<td class="listBullet" valign="top">•</td>
								<td class="listItem">
										<p>花费额外的成本购买第三方工具。 </p>
										<p>从众多的分析工具中选择一个既能满足软件分析的要求又在预算限制范围之内的工具，未必总是一项轻松的任务。另外，这些工具可能没有集成到 Visual Studio 集成开发环境 (IDE) 中，因此通常需要花费额外的时间来学习如何顺利地使用它们。 </p>
								</td>
						</tr>
						<tr>
								<td class="listBullet" valign="top">•</td>
								<td class="listItem">
										<p>构建自定义分析工具。 </p>
										<p>构建自定义分析工具需要资源、技能和经验。这对大多数公司中的开发团队而言是不现实的，仅仅是少数公司可以担负得起的选择。 </p>
								</td>
						</tr>
						<tr>
								<td class="listBullet" valign="top">•</td>
								<td class="listItem">
										<p>发布未经分析的代码。 </p>
										<p>在工时期限和预算限制紧张的情况下，发布未经分析的代码似乎是一种正确的方法，但如果软件在部署之后发生故障，可能证明采用这种错误方法的代价不菲。 </p>
								</td>
						</tr>
				</tbody>
		</table>
		<div style="MARGIN-TOP: 3px; MARGIN-BOTTOM: 10px">
				<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/dnvsentvstsdev.mspx#top">
						<img height="9" alt="返回页首" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width="7" border="0" />
				</a>
				<a class="topOfPage" href="http://www.microsoft.com/china/msdn/library/langtool/vsts/dnvsentvstsdev.mspx#top">返回页首</a>
		</div>
		<a name="ETC">
		</a>
		<h2>我们的解决方案</h2>
		<p>在 Visual Studio 2005 Team System 中，开发人员将会看到一套全新的、完全集成到 IDE 中的分析工具。这种分析工具与开发环境的紧密集成，可以帮助开发人员在产品开发的早期检测并修复代码缺陷和性能问题。这还可以帮助团队有效且高效地管理软件开发生命周期（Software Development Life Cycle，SDLC）。</p>
		<p>在 Visual Studio 2005 Team System 中，有两类分析工具可用于构建健壮而可靠的软件： </p>
		<table cellspacing="0" cellpadding="0" border="0">
				<tbody>
						<tr>
								<td class="listBullet" valign="top">•</td>
								<td class="listItem">
										<p>代码分析工具 </p>
								</td>
						</tr>
						<tr>
								<td class="listBullet" valign="top">•</td>
								<td class="listItem">
										<p>性能工具 </p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>在开发环境中集成分析工具可以帮助开发人员检测与编码、性能及安全性相关的问题。此外，可将代码分析工具作为签入策略的一部分用于每日构建 (nightly build) 过程，使开发团队能够在将代码签入到源树 (source tree) 之前修正缺陷。通过在开发的早期（而不是后期）更正问题，团队可降低修复代码缺陷的总体成本。</p>
		<p>除了完全集成到 IDE 中之外，开发人员还可以从命令行使用这些工具。</p>
		<div style="MARGIN-TOP: 3px; MARGIN-BOTTOM: 10px">
				<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/dnvsentvstsdev.mspx#top">
						<img height="9" alt="返回页首" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width="7" border="0" />
				</a>
				<a class="topOfPage" href="http://www.microsoft.com/china/msdn/library/langtool/vsts/dnvsentvstsdev.mspx#top">返回页首</a>
		</div>
		<a name="E5C">
		</a>
		<h2>Visual Studio 中的工具集成</h2>
		<p>在 Visual Studio 2005 Team System 中，通过使用代码分析工具和性能工具，开发人员可以对代码进行静态和动态分析。</p>
		<p>代码分析工具</p>
		<p>代码分析工具的目标是使开发人员能够对其项目进行静态分析，以检测和修复代码缺陷。为了实现这个目标，Visual Studio 2005 Team System 中包含了两个工具： </p>
		<table cellspacing="0" cellpadding="0" border="0">
				<tbody>
						<tr>
								<td class="listBullet" valign="top">•</td>
								<td class="listItem">
										<p>PRE<i>f</i>ast </p>
								</td>
						</tr>
						<tr>
								<td class="listBullet" valign="top">•</td>
								<td class="listItem">
										<p>FxCop </p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>PRE<i>f</i>ast</p>
		<p>PRE<i>f</i>ast 是一个静态分析工具，它为开发人员提供有关其 C/C++ 源代码中可能存在缺陷的信息。PRE<i>f</i>ast 报告的常见代码错误包括缓冲区溢出、未初始化内存、空指针取消引用、内存泄漏和资源短缺。</p>
		<p>
				<em>IDE </em>
				<em>集成</em>
		</p>
		<p>为了使开发人员能够自然地使用分析工具，可以将 PRE<i>f</i>ast 完全集成到 IDE 中。通过在项目的 <b>Property Pages</b> 上选择 <b>Yes (/prefast)</b>，开发人员可以轻松启用 PRE<i>f</i>ast，如图 1 所示。</p>
		<div style="WIDTH: 470px">
				<img height="317" alt="" src="http://www.microsoft.com/china/msdn/library/langtool/vsts/art/vsts-dev-fig01.gif" width="470" border="0" />
				<br />
				<p class="figureCaption">
						<b>图</b>
						<b> 1. </b>
						<b>启用</b>
						<b> PRE</b>
						<b>
								<i>f</i>
						</b>
						<b>ast</b>
				</p>
				<div class="figureRule">
				</div>
		</div>
		<p>在生成过程中，为源代码生成的任何 PRE<i>f</i>ast 警告都出现在 <b>Error List</b> 中。这些警告包括缺陷路径信息（如果有）；双击突出显示缺陷路径的警告，可以进入代码编辑器中的警告，如图 2 所示。</p>
		<div style="WIDTH: 470px">
				<img height="226" alt="" src="http://www.microsoft.com/china/msdn/library/langtool/vsts/art/vsts-dev-fig02.gif" width="470" border="0" />
				<br />
				<p class="figureCaption">
						<b>图</b>
						<b> 2. PRE</b>
						<b>
								<i>f</i>
						</b>
						<b>ast </b>
						<b>警告</b>
				</p>
				<div class="figureRule">
				</div>
		</div>
		<p>
				<i>#pragma support</i>
		</p>
		<pre class="codeSample">Developers can use the #pragma directive to treat warnings as errors, or disable warnings, as shown below.
#pragma warning (error: 6260)  //treat warning 6260 as an error
#pragma warning (disable: 6011)  //disable warning 6011
</pre>
		<p>
				<em>批注支持</em>
		</p>
		<p>PRE<i>f</i>ast 还支持批注以改善代码分析的精确性。批注提供有关函数参数和返回类型的之前和之后条件的附加信息。</p>
		<pre class="codeSample">#include 
[SA_Post( MustCheck=SA_Yes )] double* CalcSquareRoot
( 
   [SA_Pre( Null=SA_No )] double* source, 
   unsigned int size
)
</pre>
		<p>在上面的示例中： </p>
		<table cellspacing="0" cellpadding="0" border="0">
				<tbody>
						<tr>
								<td class="listBullet" valign="top">•</td>
								<td class="listItem">
										<p>[SA_Post ( MustCheck=SA_Yes)] 要求调用方检查 CalcSquareRoot 的返回值 </p>
								</td>
						</tr>
						<tr>
								<td class="listBullet" valign="top">•</td>
								<td class="listItem">
										<p>[SA_Pre ( Null=SA_No)] 要求调用方将非空参数“source”传递给 CalcSquareRoot </p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>
				<em>命令行支持</em>
		</p>
		<p>除了与开发环境完全集成之外，开发人员还可以从命令行使用 PRE<i>f</i>ast，如下所示。</p>
		<pre class="codeSample">C:\&gt;cl /prefast Sample.cpp
</pre>
		<p>FxCop</p>
		<p>FxCop 是一个静态分析工具，它分析托管代码程序集并报告有关程序集的信息，例如，与<a href="http://msdn.microsoft.com/library/en-us/cpgenref/html/cpconNETFrameworkDesignGuidelines.asp" target="_blank"> Microsoft .NET Framework Design Guidelines</a> 中阐述的编程和设计规则相冲突。FxCop 表示在分析过程中作为规则执行的检查。规则是一段托管代码，该代码分析程序集并返回有关它发现结果的消息。规则消息识别任何相关的编程和设计问题，并在可能的情况下，提供有关如何修复目标的信息。</p>
		<p>
				<em>IDE </em>
				<em>集成</em>
		</p>
		<p>为了使开发人员能够自然地使用分析工具，开发人员可以在项目的 <b>Property Pages</b> 上选择 <b>Run FxCop</b>，如图 3 所示。</p>
		<div style="WIDTH: 470px">
				<img height="335" alt="" src="http://www.microsoft.com/china/msdn/library/langtool/vsts/art/vsts-dev-fig03.gif" width="470" border="0" />
				<br />
				<p class="figureCaption">
						<b>图</b>
						<b> 3. </b>
						<b>启用</b>
						<b> FxCop</b>
				</p>
				<div class="figureRule">
				</div>
		</div>
		<p>有关包含或排除规则，将规则作为警告或错误的附加选项，也可以在 <b>Property Pages</b> 中找到，如图 4 所示。</p>
		<div style="WIDTH: 470px">
				<img height="128" alt="" src="http://www.microsoft.com/china/msdn/library/langtool/vsts/art/vsts-dev-fig04.gif" width="470" border="0" />
				<br />
				<p class="figureCaption">
						<b>图</b>
						<b> 4. FxCop </b>
						<b>规则</b>
				</p>
				<div class="figureRule">
				</div>
		</div>
		<p>一旦启用 FxCop，在生成过程中，FxCop 就会在 <b>Error List</b> 中报告冲突，如图 5 所示。</p>
		<div style="WIDTH: 470px">
				<img height="183" alt="" src="http://www.microsoft.com/china/msdn/library/langtool/vsts/art/vsts-dev-fig05.gif" width="470" border="0" />
				<br />
				<p class="figureCaption">
						<b>图</b>
						<b> 5. FxCop </b>
						<b>规则冲突</b>
				</p>
				<div class="figureRule">
				</div>
		</div>
		<p>
				<b>Error List</b> 提供有关规则冲突的信息和建议，以便于您纠正错误。只需在 <b>Error List</b> 中双击规则冲突，即可轻松地定位到触犯了规则的代码行。</p>
		<p>
				<em>MSBuild </em>
				<em>集成</em>
		</p>
		<p>Visual Studio 的下一个版本从根本上改进了生成过程，其方法是引入一个新的、名为 MSBuild 的生成引擎。可以通过 MSBuild 系统调用 FxCop。这使开发人员能够从命令行运行托管项目上的 FxCop。</p>
		<p>性能工具</p>
		<p>在 Visual Studio 2005 Team System 中，开发人员可以通过性能工具来度量、计算和定位代码中与性能相关的问题。这些工具都完全集成到 IDE 中，以提供无缝、友好的用户体验。</p>
		<p>性能工具支持两种分析方法： </p>
		<table cellspacing="0" cellpadding="0" border="0">
				<tbody>
						<tr>
								<td class="listBullet" valign="top">•</td>
								<td class="listItem">
										<p>采样 </p>
								</td>
						</tr>
						<tr>
								<td class="listBullet" valign="top">•</td>
								<td class="listItem">
										<p>使用仪器 </p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>在采样的过程中，数据收集基础结构将定期中断正在执行的应用程序，以确定正在执行的是哪个函数，并增加函数的采样计数。它存储有关准备函数调用的调用堆栈的信息。</p>
		<p>应用程序退出后，收集到的所有数据会生成为一个报告文件，您可以使用 IDE 中集成的报告功能轻松地查看该文件。</p>
		<p>采样的优势在于低开销，因为这只是定期中断应用程序。这使得应用程序的行为能够更接近实际情况。这种方法的缺点是，它只能获取已采样函数的相关性能数据。有可能没有对需要采样的函数进行采样，因而无法获取有关该函数的信息。 </p>
		<p>使用仪器的优势在于可以收集应用程序的特定部分的精确性能数据。在使用仪器的过程中，“enter”和“exit”探针被插入到应用程序的函数中。这些探针将报告返回给数据收集基础结构，并允许用户捕获函数执行所需的精确时间（或其他衡量标准）。</p>
		<p>分析应用程序</p>
		<p>分析应用程序的首选使用模式是首先开始采样，然后根据采样所产生的结果检测应用程序的特定方面。</p>
		<p>分析应用程序的过程相当简单。首先创建一个新的性能会话。在 Visual Studio 2005 Team System 中，可以使用 <b>Performance Session Wizard</b> 创建一个新的性能会话。</p>
		<p>Performance Session Wizard</p>
		<p>
				<b>Performance Session Wizard</b> 设置分析应用程序的必要环境。在 Visual Studio 2005 Team System 中，该向导为 EXE、DLL 和 ASP.NET 应用程序提供内置支持。</p>
		<p>可以使用该向导创建一个 <b>New Performance Session</b>，如图 6 所示。</p>
		<div style="WIDTH: 447px">
				<img height="448" alt="" src="http://www.microsoft.com/china/msdn/library/langtool/vsts/art/vsts-dev-fig06.gif" width="447" border="0" />
				<br />
				<p class="figureCaption">
						<b>图</b>
						<b> 6. </b>
						<b>启动性能向导</b>
				</p>
				<div class="figureRule">
				</div>
		</div>
		<p>
				<b>注</b> 要手动创建一个新的性能会话，请使用菜单上的 <b>New Performance Session</b> 命令。可以采用这种方法来手动分析其他类型的应用程序（例如，Windows 服务）。</p>
		<p>Performance Explorer</p>
		<p>性能会话作为运行会话向导或手动创建会话的结果而创建。<b>Performance Explorer</b> 可以将其直观地表示出来，如图 7 所示。</p>
		<div style="WIDTH: 182px">
				<img height="144" alt="" src="http://www.microsoft.com/china/msdn/library/langtool/vsts/art/vsts-dev-fig07.gif" width="182" border="0" />
				<br />
				<p class="figureCaption">
						<b>图</b>
						<b> 7. </b>
						<b>性能资源管理器</b>
				</p>
				<div class="figureRule">
				</div>
		</div>
		<p>
				<b>Performance Explorer</b> 给用户呈现了层次结构。该层次结构的根节点表示 <b>Performance Session</b>。这种节点的属性是用户在创建 <b>Performance Session</b> 时设置的属性。如果用户使用 <b>Performance Session Wizard</b> 创建会话，则这些属性体现了用户在使用向导的过程中所选择的值。如果用户手动创建 <b>Performance Session</b>，则这些属性包含了它们的默认值。</p>
		<p>根节点有两个子节点：<b>Targets</b> 节点和 <b>Reports</b> 节点。<b>Targets</b> 节点包含一个或多个目标，目标可以是 EXE、DLL 或 ASP.NET 应用程序。</p>
		<p>
				<b>Reports</b> 节点包含与某个特定 <b>Performance Session</b> 相关的所有报告。</p>
		<p>性能会话报告</p>
		<p>一旦应用程序执行完毕，系统就会将一个性能会话报告自动添加到 <b>Reports</b> 节点。可以通过下面的视图来查看这些报告：</p>
		<p>
				<em>Summary </em>
				<em>视图</em>
		</p>
		<p>Summary 视图为开发人员提供了其调查的起点。它显示应用程序执行过程中开销最高的函数，如图 8 所示。从该视图中的每个数据点，用户都可以定位到更详细的视图。</p>
		<div style="WIDTH: 470px">
				<img height="262" alt="" src="http://www.microsoft.com/china/msdn/library/langtool/vsts/art/vsts-dev-fig08.gif" width="470" border="0" />
				<br />
				<p class="figureCaption">
						<b>图</b>
						<b> 8. Summary </b>
						<b>视图</b>
				</p>
				<div class="figureRule">
				</div>
		</div>
		<p>
				<em>Functions </em>
				<em>视图</em>
		</p>
		<p>Functions 视图显示在应用程序的执行过程中调用的全部函数，这些函数存在于由该应用程序引用的所有模块之中，如图 9 所示。该视图显示的信息取决于所用的分析方法（采样与使用仪器）。</p>
		<div style="WIDTH: 450px">
				<img height="111" alt="" src="http://www.microsoft.com/china/msdn/library/langtool/vsts/art/vsts-dev-fig09.gif" width="450" border="0" />
				<br />
				<p class="figureCaption">图 9. Functions 视图</p>
				<div class="figureRule">
				</div>
		</div>
		<p>
				<em>Caller/Callee </em>
				<em>视图</em>
		</p>
		<p>Caller/Callee 视图提供在 Functions 视图中所列函数的详细信息，如图 10 所示。</p>
		<div style="WIDTH: 470px">
				<img height="60" alt="" src="http://www.microsoft.com/china/msdn/library/langtool/vsts/art/vsts-dev-fig10.gif" width="470" border="0" />
				<br />
				<p class="figureCaption">
						<b>图</b>
						<b> 10. Caller/Callee </b>
						<b>视图</b>
				</p>
				<div class="figureRule">
				</div>
		</div>
		<p>
				<em>Callstack </em>
				<em>视图</em>
		</p>
		<p>Callstack 视图使用户能够向下搜索特定的调用跟踪，并分析哪些跟踪对性能的影响最大。</p>
		<div style="WIDTH: 470px">
				<img height="103" alt="" src="http://www.microsoft.com/china/msdn/library/langtool/vsts/art/vsts-dev-fig11.gif" width="470" border="0" />
				<br />
				<p class="figureCaption">
						<b>图</b>
						<b> 11. Callstack </b>
						<b>视图</b>
				</p>
				<div class="figureRule">
				</div>
		</div>
		<p>
				<em>Type </em>
				<em>视图</em>
		</p>
		<p>Type 视图提供有关某个特定类型的实例数量和总字节数的信息，如图 12 所示。</p>
		<p>
				<em>命令行支持</em>
		</p>
		<p>可以通过命令行工具使用性能工具功能。这为用户提供了灵活性，用户既可以从命令行运行这些工具，又可以通过脚本来使用它们，以便自动执行任务。</p>
<img src ="http://www.cppblog.com/mzty/aggbug/8630.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2006-06-16 12:16 <a href="http://www.cppblog.com/mzty/archive/2006/06/16/8630.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>单元测试小技巧</title><link>http://www.cppblog.com/mzty/archive/2006/06/16/8628.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Fri, 16 Jun 2006 03:53:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2006/06/16/8628.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/8628.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2006/06/16/8628.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/8628.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/8628.html</trackback:ping><description><![CDATA[
		<h1>单元测试小技巧</h1>
		<h2 class="subtitle">编写可维护的节省时间和精力的单元测试</h2>
		<div class="date">发布日期： 2006-04-17<span class="datePipe"> | </span>更新日期： 2006-04-17</div>
		<div class="overview">
				<p>这篇文章描述了：</p>
				<table cellspacing="0" cellpadding="0" border="0">
						<tbody>
								<tr>
										<td class="listBullet" valign="top">•</td>
										<td class="listItem">
												<p>单元测试的信任</p>
										</td>
								</tr>
								<tr>
										<td class="listBullet" valign="top">•</td>
										<td class="listItem">
												<p>测试正确事件</p>
										</td>
								</tr>
								<tr>
										<td class="listBullet" valign="top">•</td>
										<td class="listItem">
												<p>创建维护测试</p>
										</td>
								</tr>
								<tr>
										<td class="listBullet" valign="top">•</td>
										<td class="listItem">
												<p>创建易读测试</p>
										</td>
								</tr>
						</tbody>
				</table>
				<p>这些天有很多的关于单元测试的和在不同的场景下为他们的应用程序编写单元测试(起始于, 我们2005年六月的 <i>MSDN</i><sup>®</sup><i>Magazine</i> 中有关测试你的数据层的文章, <em>Know Thy Code: Simplify Data Layer Unit Testing using Enterprise Services</em>)的讨论。这些意味着有很多的开发者自言自语（或者对于他们的团队）到：“哎，我们也需要开始编写测试了！”因此他们开始编写单元测试上面的单元测试直到他们达到了一个测试自己已经成为问题的程度。或许维护他们是一个太过困难，花费太长时间，或者他们并没有足够的易读性以便于理解，更或者他们本身存在bugs有一点是能够使得我们的开发人员可以下定决心去做的，那就是： 花费他们宝贵的时间以用来改进提高他们的测试或者忽略其中的问题, 从而有效的甩掉那些艰苦的工作。而这些困难的原因仅仅是因为那些不熟练的写入单元测试。.在这篇文章中，我将为大家带来在过去一年多时间里我在开发，提供咨询和培训开发者等方面有总结出来的一些最重要的练习和试验。这些小的技巧可以帮助您写出更有效的，可维护，和鲁棒性更好的单元测试。同时我希望这些总结和忠告可以帮助您避免一些由于错误引起的大量的时间的消耗。</p>
		</div>
		<center>
				<img title="" height="6" alt="*" src="http://img.microsoft.com/library/gallery/templates/MNP2.Common/images/3squares.gif" width="30" border="0" />
		</center>
		<div style="HEIGHT: 18px">
		</div>
		<h5 style="PADDING-TOP: 2px">本页内容</h5>
		<table style="MARGIN-TOP: 7px; MARGIN-BOTTOM: 12px" cellspacing="0" cellpadding="0" border="0">
				<tbody>
						<tr valign="top">
								<td>
										<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/UnitTestingTips.mspx#EQB">
												<img height="9" alt="单元测试的信任" hspace="4" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width="7" vspace="2" border="0" />
										</a>
								</td>
								<td class="onThisPage">
										<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/UnitTestingTips.mspx#EQB">
												<font color="#002c99">单元测试的信任</font>
										</a>
								</td>
						</tr>
						<tr valign="top">
								<td>
										<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/UnitTestingTips.mspx#EDC">
												<font color="#002c99">
														<img height="9" alt="测试正确的事情" hspace="4" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width="7" vspace="2" border="0" />
												</font>
										</a>
								</td>
								<td class="onThisPage">
										<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/UnitTestingTips.mspx#EDC">
												<font color="#002c99">测试正确的事情</font>
										</a>
								</td>
						</tr>
						<tr valign="top">
								<td>
										<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/UnitTestingTips.mspx#EZD">
												<font color="#002c99">
														<img height="9" alt="创建维护测试" hspace="4" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width="7" vspace="2" border="0" />
												</font>
										</a>
								</td>
								<td class="onThisPage">
										<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/UnitTestingTips.mspx#EZD">
												<font color="#002c99">创建维护测试</font>
										</a>
								</td>
						</tr>
						<tr valign="top">
								<td>
										<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/UnitTestingTips.mspx#EQF">
												<font color="#002c99">
														<img height="9" alt="创建易读性测试" hspace="4" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width="7" vspace="2" border="0" />
												</font>
										</a>
								</td>
								<td class="onThisPage">
										<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/UnitTestingTips.mspx#EQF">
												<font color="#002c99">创建易读性测试</font>
										</a>
								</td>
						</tr>
						<tr valign="top">
								<td>
										<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/UnitTestingTips.mspx#ELG">
												<font color="#002c99">
														<img height="9" alt="在你的设置方法中避免部分相关的代码" hspace="4" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width="7" vspace="2" border="0" />
												</font>
										</a>
								</td>
								<td class="onThisPage">
										<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/UnitTestingTips.mspx#ELG">
												<font color="#002c99">在你的设置方法中避免部分相关的代码</font>
										</a>
								</td>
						</tr>
						<tr valign="top">
								<td>
										<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/UnitTestingTips.mspx#E2G">
												<font color="#002c99">
														<img height="9" alt="总结" hspace="4" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width="7" vspace="2" border="0" />
												</font>
										</a>
								</td>
								<td class="onThisPage">
										<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/UnitTestingTips.mspx#E2G">
												<font color="#002c99">总结</font>
										</a>
								</td>
						</tr>
				</tbody>
		</table>
		<a name="EQB">
		</a>
		<h2>单元测试的信任</h2>
		<p>在这个部分，我将略述出一些最通用的信任，这些信任来自于在使用大量单元测试获得的好处和解释为什么这些信任通常不是必须真实的。然后我们会帮助您在您的工程中拥有这些信任。</p>
		<p>
				<b>更加简单的跟踪</b>
				<b>Bug</b>  当然这并不是必须的，那么您怎么知道您的测试是正确的？ 是否存在在一些测试环节测试失败的情况？另外您又如何知道您的测试覆盖了系统中多少的代码量？是否测试到了程序中的错误，错误又在哪里等等的问题。</p>
		<p>当你在你的单元测试中发现了bug后又会发生什么事情哪？你会突然间得到很多与愿意错误的反馈，bug被发现，但是问题并不在你测试的代码中。你的测试的逻辑存在一个bug，因此测试失败了。这些bug也是您最难被检查出来的，因为您通常会去检查您的应用程序而不会去检测你的测试环节。在这部分中，我会展示给你如何确认大量的单元测试，事实上就是使得跟踪bug变得更加容易。</p>
		<p>
				<b>代码更加便于维护</b> 从最终点考虑，你可以倾向于认为这些信任并不是必须的，当然你是对的，让我们去说，代码中每个逻辑方法至少要有一个测试方法（当然，你可能拥有一个以上的方法）在一个好的测试覆盖的工程中，大概有百分之六十的代码是能够得到单元测试的，现在不得不考虑到测试也是要被维护的，如果针对一个复杂的逻辑方法你有20个测试，那么当你向这个方法添加一个参数时会发生什么事情哪？测试无法编译。当你修改了类的结构的时候同样会发生这样的事情。这时你突然发现为了能让你的应用程序继续工作你自己需要改变大量的测试。当然这会花费你大量的时间。</p>
		<p>为了使这个信任确认下来，你需要确认你的测试是便于维护的。保持DRY规则写入：不要重复你自己。我们将更加接近的来看这个问题。</p>
		<p>
				<b>代码更加容易被理解</b>  单元测试的好处通常并非是人们最初所期待的，在一个工程中考虑修改一些你之前从没有看过的代码(比方说,一个特殊的类或者方法).你将如何动手处理这些代码？你可能需要在项目中去浏览这些特定的类或者方法使用的代码，理所当然，单元测试就是这样例子的一个很好的场所。同时，当正确写入的时候，单元测试可以为工程提供一个API文件的容易读取的设置，使得文档的处理和代码的理解对于整个团队中的新老开发者一样的简单，便捷。然而，这些只能在测试是易读的和容易理解的情况下才能被确认，这个规则很多的单元测试开发者并不会遵循。我将详述这个信任，然后在这篇文章的易读测试的部分给你展现如何在去写易读的单元测试。</p>
		<div style="MARGIN-TOP: 3px; MARGIN-BOTTOM: 10px">
				<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/UnitTestingTips.mspx#top">
						<img height="9" alt="返回页首" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width="7" border="0" />
				</a>
				<a class="topOfPage" href="http://www.microsoft.com/china/msdn/library/langtool/vsts/UnitTestingTips.mspx#top">
						<font color="#002c99">返回页首</font>
				</a>
		</div>
		<a name="EDC">
		</a>
		<h2>测试正确的事情</h2>
		<p>新来者在Test Driven Development (TDD)中一个最通常的错误就是他们通常会搞混"Fail by testing something illogical."中的"Fail first"要求。例如，你可以用下面的规格开始这个方法：</p>
		<pre class="codeSample">' returns the sum of the two numbers
Function Sum(ByVal a As Integer, ByVal b As Integer) As Integer
</pre>
		<p>你可以向如下的方式写一个失败测试：</p>
		<pre class="codeSample">&lt;TestMethod()&gt; _
Public Sub Sum_AddsOneAndTwo()
    Dim result As Integer = Sum(1, 2)
    Assert.AreEqual(4, result, "bad sum");
End Sub
</pre>
		<p>初看上去这个处理像是一个写失败测试的好的方法，它完全错失了你写错误测试的初始点。</p>
		<p>一个失败测试验证了在代码中存在一些错误，当你的测试完成后这个测试应该是通过的，现在的例子中，无论如何，测试都将会失败，即使是代码完成，因为测试逻辑上不是正确的。如果希望测试通过测需要测试自身进行修改――而不是程序的代码的改变（当程序代码改变的时候，是test-first规划的意图）简短来说，这个测试不会反映出程序代码完成后的最终的结果，因此这个不是一个好的测试。</p>
		<p>TDD中一个好的测试要求你去修改代码，从而使它能够按照想要的方式工作，这一点要胜于强迫你去反映现在的真实情况或者一个非逻辑要求的渴望的结果。例如，当1＋1返回0时就意味着测试失败。这个简单的例子和这种情况是相似的，在练习中，如果现在的需求是在工作的，测试应该可以反映你所期待的结果，然后你可以调整现在代码的情况去通过这个测试。</p>
		<p>作为一个规则，一个已经调通的测试不应该被移除掉，因为这个测试在维护工作中可以用于恢复测试。他们在你改变代码时用来确定你没有损害到现在已经工作的函数。这就是为什么你不应该修改那些已经通过的测试，除非是一些很小的修改，例如增加它的可读性（换句话说，分解测试）</p>
		<p>
				<b>当一个测试非正常失败</b>  有时你可能遇到失败的测试，而这时你对代码的改变是完全合理的。这通常是因为你遇到了冲突的需求。一般来说，可能是一个新的需求（一个改变的特性）与一个旧的可能已经不再有效的需求发生了冲突。这有两种可能：</p>
		<table class="numberedList" cellspacing="0" cellpadding="0" border="0">
				<tbody>
						<tr valign="top">
								<td class="listNumber" nowrap="" align="right">
										<p>1.</p>
								</td>
								<td>
										<p>在旧的需求或者无效或者在别处测试的情况下删除被验证本质上不再有效的失败的测试</p>
								</td>
						</tr>
						<tr valign="top">
								<td class="listNumber" nowrap="" align="right">
										<p>2.</p>
								</td>
								<td>
										<p>改变旧的测试使你可以测试新的要求（本质上使用新的测试），然后在新的设置下（测试的逻辑状态相同，但是初始功能函数可能有所不同）测试旧的需求。</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>而有时候一个测试在使用不完整的技术去完成任务的时候也是有效的，例如，你有一个成员类带有一个FOO方法，它表现为某几种行为，它已经经由Test在X年前测试完成，然后现在一些其他的需求加了进来，方法的逻辑增强了，从而可以去处理一些类似于在获取数据时丢失一些参数的异常处理。但这时，突然Test X失败了，虽然在测试这个函数的时候只是使用了同样的类。这个测试的失败是因为在调用方法之前丢失了一些初始处理步骤。</p>
		<p>这并不意味着你需要移除Test X，你将丢失对于一些重要功能的测试，这时你应该去关心那些初始化时的问题，而不是改变类的创建以用来适应你新的意图。</p>
		<p>当然如果你那里有200个测试都是因为旧的结构导致的失败，你就应该找到这个问题来维护你的测试。这就是为什么你应该总是移除你测试中的副本尤其是在生产代码中。</p>
		<p>
				<b>测试覆盖和测试</b>
				<b>Angles</b>  你如何知道是否你的新代码是一个好的覆盖？当试图移动一个链接或者一个约束检查后，如果所有的测试依然通过，那么你就没有足够的代码复制然后你可能需要添加其他的测试单元。</p>
		<p>确认你添加正确测试的最好方法就是测试一些最平常的行和检查直到用非常的手段使它出错。这个也许很难，但是如果你不能考虑出一个让代码出错的方法，你就可能没有好的理由在最初的地方写下这行代码。</p>
		<p>你不知道什么时候下一个开发者会试图运行你的程序，他可能优化或者错误的删除一些包含本质的行。如果你没有一个测试，它就会失败，其他的开发者可能不会知道他们犯了错误。</p>
		<p>你也可能试图利用一些常量去替代一些已经通过了的测试中调用的各种各样的参数，例如，看下面的方法：</p>
		<pre class="codeSample">Public Function Sum(ByVal x As Integer, ByVal y As Integer, _
        ByVal allowNegatives As Boolean) As Integer
    If Not allowNegatives Then Throw New Exception()
    Return x + y
End Function
</pre>
		<p>你可以打乱代码去测试覆盖，这有一些关于如何测试的变化：</p>
		<pre class="codeSample">' Try this...
If Not True Then ' replace flag with const
    If x &lt; 0 OrElse y &lt; 0 Then Throw New Exception()
End If

' Or this...
If Not allowNegatives Then
    ' replace check with const
    If False OrElse y &lt; 0 Then Throw New Exception()
End If
</pre>
		<p>如果所有的测试依然通过，那么你缺少了一个测试，另外一个红色标志是在你为多种相同值测试的检查。如下：</p>
		<pre class="codeSample">Assert.AreEqual(3, retval)
</pre>
		<p>一些方法的关系只看一次（在一个测试中）意味着你可以安全的返回3作为一个值，然后所有的针对这个方法的测试都将通过，这个当然意味着你丢失了一个测试。如果你在单元测试中检查一下代码，它就很容易被检查出来。</p>
		<p>确保你的测试写的越简单越好，一个单元测试一般不包括一个if switch或者其他任何的逻辑声明。如果你发现你自己在你的测试中写了一些类似于逻辑声明的东西，这是一个好的机会来测试一个以上的事件，在做这样的操作的时候，你会使得你的测试比读和维护更加的困难，在生产代码中同样如此。保持你的测试简单，你在生产代码中发现bug要胜于在你的单元测试中。</p>
		<p>
				<b>使测试易于运行</b>  如果你的测试并不容易运行，那么人们不会信任它。你的应用程序最有可能有下面两种类型的测试：</p>
		<table cellspacing="0" cellpadding="0" border="0">
				<tbody>
						<tr>
								<td class="listBullet" valign="top">•</td>
								<td class="listItem">
										<p>测试在没有任何配置的情况下平稳的运行（这种类型的测试，我们可以在任何的机器上，在代码的最终版上或者在源控制上测试，并且做到没有任何故障的测试）</p>
								</td>
						</tr>
						<tr>
								<td class="listBullet" valign="top">•</td>
								<td class="listItem">
										<p>在运行前需要一些配置.</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>第一种类型是你应该模仿的，第二种类型是你通常做的，尤其你如果你是一个新的单元测试。如果你发现你自己测试时有很多的特殊的需求，现在是正常的，但是重要的一点就是你要隔离出两个组让他们能够单独的去做测试。</p>
		<p>我们的想法是任意一个开发者都应该有能力修改和运行一些不需要设置特殊的配置的测试进行测试。如果这有一些测试需要在运行前有特殊的关注，开发者应该知道他们，然后他可以花一些时间学习这些测试的方法。因为很多的开发者比较的懒（当然，不是你），你可以设想，他们不会去做那些特殊的设置，相反，他们会让测试失败因为他们有更好的事情去做。</p>
		<p>当用户让测试失败时，他们开始考虑他们不能够信任这些测试了。很难说是否测试可以在一个中找到一个正式的bug或者只是一个错误的定位。开发者可能不明白为什么测试者会在一开始就执行失败。一旦他们不再信任你的测试，开发者将会停止运行它们，那么bug就会驻留在程序中，之后一连串的麻烦就来了。。。</p>
		<p>
				<b>为了避免这件事情，确认你总是有一个组准备好了去测试，测试程序则是可以安全运行，可信任的。把那些属于配置挑战组的测试放到不同的文件夹，树或者工程中，同时标记特殊的说明指明他们在运行前需要做什么。完成这些后，开发者可以不投入时间去配置就开始测试工作。当他们有时间和需要时，他们也可以配置，运行更多的测试环节。</b>
		</p>
		<div style="MARGIN-TOP: 3px; MARGIN-BOTTOM: 10px">
				<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/UnitTestingTips.mspx#top">
						<img height="9" alt="返回页首" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width="7" border="0" />
				</a>
				<a class="topOfPage" href="http://www.microsoft.com/china/msdn/library/langtool/vsts/UnitTestingTips.mspx#top">
						<font color="#002c99">返回页首</font>
				</a>
		</div>
		<a name="EZD">
		</a>
		<h2>创建维护测试</h2>
		<p>我们应该试着避免测试私有或保护成员。这篇文章也许能够帮助一些人解决一部分问题，但是我很坚决相信百分之九十九的时间，你可以全面的测试一个类，通过编写一些与它的独立公共接口相反的单元测试。测试私有成员可以使你的测试更加脆弱，如果这个需要被测试的类的一些内在方面略有改动的话。你应该使用通过调用一些代码里别处的公共功能这一方法去测试私有功能。当你依然能够确定全部功能并没有改变的时候，仅仅测试公共成员会导致测试遭受常量代码的因式分解以及内部的执行情况改变。</p>
		<p>
				<b>在可能的时候，应该重新使用你的创造物，处理过程，和声明代码。不要在一个单元测试中直接的创建类的实例。如果你在任何并不包含在此单元测试框架中的类前面看到这个单词“</b>new”，你应该考虑一下将你创造的代码放在一个特殊的整体方法之中，它可以为你创建一个对象实例。你可以到时再重新使用这个方法来获得你的测试在其他测试之中的最新实例。这样可以帮助你来保持这个测试维护所需的时间，然后在测试进行的时候，从对代码无法预料的改变之中保护你的测试。作为一个例子，<a href="http://msdn.microsoft.com/msdnmag/issues/06/01/UnitTesting/default.aspx?fig=true#fig1" target="_blank"><b><font color="#002c99">Figure 1</font></b></a>展示了一对简单的测试，它使用了一个Calc类。</p>
		<p>假设你有20，或者你甚至有100，与Calc类做相反测试，所有这些看起来令人吃惊的相似。现在一个计划的改变迫使你不得不删除默认的Calc构造器并且使用一个含有一些参数的不同的构造器。马上，你所有的测试就被暂停了。你可能可以很轻易的发现问题的关键并修复它，但你也可能做不到。最主要的问题是你将会浪费很多宝贵时间在修理你的测试上面。如果你在你的测试类之中使用一个整体的方法去创建Calc 实例，就像<a href="http://msdn.microsoft.com/msdnmag/issues/06/01/UnitTesting/default.aspx?fig=true#fig2" target="_blank"><b><font color="#002c99">Figure 2</font></b></a>所显示的那样，这些就并不是个问题。</p>
		<p>我已经对测试做了一些改变已使它们能够具有更多可维护性。首先，我将新创建的代码迁移至可以再度使用的整体方法之中。这就意味着我只需仅仅改变一个简单的方法以使得在这个测试类中的所有测试在一个新的构造器中的能够正常的工作。另外一个为创造问题而设的简单解决方法是把创作物迁移到测试类的&lt;TestInitialize()&gt;方法之中。不幸运的是，这个能够很好的工作仅仅在你重新使用一个对象并在一些测试中把它当作一个局部类变量。如果你仅仅为一些测试使用它（部分相关成员），你倒不如在测试中将它们实例化，并且使它们更具易读性。</p>
		<p>顺便一提的是，请注意，我已经将方法命名为Factory_CreateDefaultCalc 。我很喜欢将我测试中的任何帮助方法用特殊的前缀来命名，这样我就能很轻易的掌握它是做什么用的。这样对易读性也是非常有帮助的。</p>
		<p>我的第二个改变是重新使用测试中的声明代码，并将这段代码迁移到一个确认方法之中。所谓确认方法是你测试中的一个可再度使用的方法， 这个方法包含了一个声明语句但是它可以接受不同输入和在输入的基础上进行校验。当你在不同输入或者不同的初始状态下一次又一次的声明同一事物时，你可以使用确认方法。这一方法的优点是既使在一个不同的方法里面声明，如果这个声明失败了你将可以继续保有一个异常处理，而且原始调用测试将会显示在测试失败输出窗口之中。</p>
		<p>我也在Calc 中传递实例而不是使用一个局部变量，因此我知道我经常传递一个实例，而且这个实例是调用测试将其初始化的。当你想要改变对象状态时你可能想要做同样的事情，举个例子来说，当在测试下或者在将会传递给测试的对象下配置特殊对象时，可以使用特殊的Configure_XX方法。这些方法应该能够解释他们配置一个对象将会用来做什么用。<a href="http://msdn.microsoft.com/msdnmag/issues/06/01/UnitTesting/default.aspx?fig=true#fig3" target="_blank"><b><font color="#002c99">Figure 3</font></b></a>之中的代码就是以上方法的实例。</p>
		<p>这个测试拥有很多设置代码可以用来处理向注册管理器对象中添加初始状态，它是这个测试类之中的成员。在此的确也有一些重复。<a href="http://msdn.microsoft.com/msdnmag/issues/06/01/UnitTesting/default.aspx?fig=true#fig4" target="_blank"><b><font color="#002c99">Figure 4</font></b></a>显示了在初始代码之外这些事例在因式分解之后将会如何变化。</p>
		<p>修订测试具有非常高的可读性和稳定性。仅仅需要注意的是不要那么的refactor你的测试，他们可能会以一个单一的，不可读的代码行作为结束。应该注意的是我在这里可能依然使用一个Verify_XX 方法，但是这并不是我真正要在这里加以说明的。</p>
		<p>
				<b>消除测试之间的依赖关系</b>
		</p>
		<p>一个测试应该能够自我独立。它不应该与其他测试相关联，也不应该依赖任何具有特殊运行顺序的测试，它应该能够获得你所写的所有测试，可以随意运行所有测试或者只运行其中的一部分，并且是以任何顺序，而且要能够确保它们无论怎样都应该正确的运行。如果你不能够执行这个规则，你将会只在某种特殊的情况下按照预期的表现来运行的状况下结束你的测试。这样子的话，当你在最终期限下与此同时你还想确定你没有向系统之中引进新的问题的时候，当然就会出现问题。你可能很困惑而且考虑着是不是你的代码出现问题，这时，在事实上，问题其实仅仅是你的测试运行顺序所引起的。因此，你可能开始错过了一些在测试中失败的结果而且使它越写越少。这将会是个长期的过程。</p>
		<p>如果你从一个测试调出至另一个测试之中，你应该在它们之间创建一个从属关系。你本质上说是在一个测试中测试两个事物（我将会在下一章中解释为什么这会成为一个问题）。就另一方面来说，如果你有测试B，它与测试A 所产生的状态是不相关的，那么你会陷入“顺序”陷阱之中。如果你或者其他人想要改变测试A，测试B将会暂停而且你不知它暂停的原因。对这些故障进行故障处理会浪费很多时间。</p>
		<p>使用&lt;TestInitialize()&gt; 和&lt;TestCleanup()&gt;方法是本质上能够获得更好的测试隔离。确定你的测试数据时刻是最新的，而且测试下对象的也具有新的实例，而且所有的状态可以提前预知，而且无论你的测试在任何地方或者任何时间被运行，运行的情况都是相同的。</p>
		<p>
				<b>在一个单独单元测试中避免多重声明</b>
		</p>
		<p>我们将声明故障看作一个程序弊病的象征且声明被当作软件体的指示点或者“血液检查”。你可以找到越多的症状，程序弊病就越可以轻松的被诊断和排除掉。如果你在一个测试中定义了多重声明，只有第一个故障声明将会以抛出异常的方式显示出来。请参考下面插图之中的测试代码：</p>
		<pre class="codeSample">&lt;TestMethod()&gt; _
Public Sub Sum_AnyParamBiggerThan1000IsNotSummed()
    Assert.AreEqual(3, Sum(1001, 1, 2)
    Assert.AreEqual(3, Sum(1, 1001, 2) ' Assert fails
    Assert.AreEqual(3, Sum(1, 2, 1001) ' This line never executes
End Sub
</pre>
		<p>
				<b>你可能没有发现以上代码之中其他可能的征兆。在一个故障之后，并发的声明不会被执行。这些不能生效的声明可能提供了有价值的数据（或者征兆）可能能够帮助你很快的集中的焦点而且发现潜在的问题。因此在一个独立的测试中运行多重声明增加了具有很少价值复杂性。另外，声明应该被独立的运行，我们应该设置自我独立的单元测试以使得你具有能够很好的发现错误的机会。</b>
		</p>
		<div style="MARGIN-TOP: 3px; MARGIN-BOTTOM: 10px">
				<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/UnitTestingTips.mspx#top">
						<img height="9" alt="返回页首" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width="7" border="0" />
				</a>
				<a class="topOfPage" href="http://www.microsoft.com/china/msdn/library/langtool/vsts/UnitTestingTips.mspx#top">
						<font color="#002c99">返回页首</font>
				</a>
		</div>
		<a name="EQF">
		</a>
		<h2>创建易读性测试</h2>
		<p>如果你以前写过单元测试，你是否在单元测试上写了一个好的声明行？可许不是这样的，大多数开发者并不厌烦去写一个好的声明因为他们更加关心去写测试。</p>
		<p>假设你是团队中的一个新的开发者，你试图读一个单元测试。连接这个：</p>
		<pre class="codeSample">&lt;TestMethod()&gt; _
Public Sub TestCalcParseNegative()
    Dim c As New Calc
    Assert.AreEqual(1000, c.Parse("-1, -1000")
End Sub
</pre>
		<p>作为一个简单的练习，如果你理解了上例中Calc分列方法的用法，你很可能可以进行很好的推测，但是他可以简单的作为人员数量的用例使得输出结果为1000:</p>
		<table cellspacing="0" cellpadding="0" border="0">
				<tbody>
						<tr>
								<td class="listBullet" valign="top">•</td>
								<td class="listItem">
										<p>在组中返回最大的负数作为一个正数。</p>
								</td>
						</tr>
						<tr>
								<td class="listBullet" valign="top">•</td>
								<td class="listItem">
										<p>如果数字是负数且返回值为剩下几个数的总和作为一个正数，那么忽略第一个数字。</p>
								</td>
						</tr>
						<tr>
								<td class="listBullet" valign="top">•</td>
								<td class="listItem">
										<p>返回相互作乘积运算而得的数字。</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>现在请参考下面在单元测试之中的小改动：</p>
		<pre class="codeSample">&lt;TestMethod()&gt; _
Public Sub Parse_NegativeFirstNum_ReturnsSumOfTheRestAsPositive()
    Dim c As New Calc
    Dim parsedSumResult As Integer = c.Parse("-1", "-1000")
    Const SUM_WITH_IGNORED_FIRST_NUM As Integer = 1000
    Assert.AreEqual(SUM_WITH_IGNORED_FIRST_NUM, parsedSumResult)
End Sub
</pre>
		<p>
				<b>这个是不是比较容易理解呢？当声明消息消失之后，表达意图最合适的地方就是测试的名字。</b> 如果你广泛的使用了它，你将会发现你不再需要读测试代码就能明白代码测试的目的所在。事实上，你经常根本不需要写任何注释，因为代码，特别是那些带着实例的，他们自己是证明自己的。</p>
		<p>名字包含了三部分内容： 测试下方法的名字（解析），测试下的状态或者规则（带着第一个负数传递一个字符串），以及预期的输出或者运行情况（剩余数字的总和以一个正数的形式返回）。需要注意的是我从名称中将Test以及Calc这两个词删除。我已经知道这是一个属性的测试因此在此没有重复此信息的必要。我也知道这是一个在Calc类中的测试因为测试类经常是写给一个特殊类的（这个类也许已经被命名为CalcTests）。</p>
		<p>名字也许会很长，但是又有谁在乎呢？它读起来更像是一个标准英语的句子而且它使得一个新来的开发者更容易明白测试的内容。更是这样，当这个测试发生故障时，我们甚至不需要调试代码就可以知道问题究竟出在哪里。</p>
		<p>需要注意的是，我已经在前面分别实际演示了通过在不同行中创建一个结果变量的方法从声明操作中进行分解操作。这样做至少有两个理由。第一个理由是，你可以为一个变量分配一个可读性强的名字，它可以包含结果，这样可以使你的声明行非常易于理解以及易于读。第二点是，测试下与对象相反的invocation 可能非常的长，它可能会使你的声明行延伸出屏幕的边缘之外，这样导致测试者向右滚屏。就我个人而言，我认为这个是非常恼人的。</p>
		<p>我在我的测试中使用了很多常量以确保我的声明读起来像一本书。在先前的例子之中，你可以读到声明中说：“确保分解总数是与忽略第一个数后所得总和是相等的。” 为你的变量取一个很好的名字能够在某些程度上弥补对于测试的命名不足。</p>
		<p>
				<b>当然，有时一个声明</b> 消息是在一个单元测试中传递intent的最好的方法。 一个好的声明消息始终能够解释什么因该会发生或者什么发生了而且为什么会出错。举个例子来说，“分列应该忽略掉第一个数字如果这个数字是个负数的话”，“分列不能够忽略掉第一个负数”，还有“X调用对象Y标记错误”这些都是有用的声明消息，它们很清晰的描述了结果的情况。</p>
		<div style="MARGIN-TOP: 3px; MARGIN-BOTTOM: 10px">
				<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/UnitTestingTips.mspx#top">
						<img height="9" alt="返回页首" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width="7" border="0" />
				</a>
				<a class="topOfPage" href="http://www.microsoft.com/china/msdn/library/langtool/vsts/UnitTestingTips.mspx#top">
						<font color="#002c99">返回页首</font>
				</a>
		</div>
		<a name="ELG">
		</a>
		<h2>在你的设置方法中避免部分相关的代码</h2>
		<p>一个&lt;TestInitialize()&gt; 方法是样例成员变量在测试中使用的一个好地方。你所有的测试，只有在一部分的测试中避免变量。他们可以为测试设置本地变量。如果你创建了部分相关的实例作为类的成员，用来在测试中简单的避免创建的副本，你应该使用在文章前面解释的工厂方法，使用部分相关变量使得你的代码和设置方法缺少易读性。一旦变量在一个或者每个测试中使用，那么他应该是&lt;TestInitialize()&gt; 方法的一个成员和变量。</p>
		<p>
				<a href="http://msdn.microsoft.com/msdnmag/issues/06/01/UnitTesting/default.aspx?fig=true#fig5" target="_blank">
						<b>
								<font color="#002c99">Figure 5</font>
						</b>
				</a> 展现了一个拥有两个成员变量的类的测试。但是他们中的一个(cxNum)只被部分使用。<a href="http://msdn.microsoft.com/msdnmag/issues/06/01/UnitTesting/default.aspx?fig=true#fig6" target="_blank"><b><font color="#002c99">Figure 6</font></b></a> 展现了如何在测试中替换代码从而使它更加易读的方法。</p>
		<div style="MARGIN-TOP: 3px; MARGIN-BOTTOM: 10px">
				<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/UnitTestingTips.mspx#top">
						<img height="9" alt="返回页首" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width="7" border="0" />
				</a>
				<a class="topOfPage" href="http://www.microsoft.com/china/msdn/library/langtool/vsts/UnitTestingTips.mspx#top">
						<font color="#002c99">返回页首</font>
				</a>
		</div>
		<a name="E2G">
		</a>
		<h2>总结</h2>
		<p>就像你所看到的，写单元测试并不是一个微不足道的任务，如果步骤正确，单元测试可以为开发者的生产力和代码的质量带来令人惊讶的提高，他可以帮助你去创建的应用程序含有更少的错误，同时也可以便于其他的开发者去洞察你的代码，但是他也需要在之前承担一个义务，确认遵循一些简单的规则。当方法并不是很好时，单元测试则可能达到一个相反的结果，从而浪费您的时间，并且使测试过程更加复杂。</p>
		<p>
				<b>Roy Osherove</b> Agile组的负责人, 这个顾问公司致力于agile software development 和 .NET architecture的研究工作. Roy同时维护了一个blog在<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/www.iserializable.com" target="_blank"><font color="#002c99"> www.iserializable.com</font></a>上有相关的信息. 你可以通过Email联系他： <em>Roy@TeamAgile.com</em>.</p>
		<p>
				<a href="http://msdn.microsoft.com/msdnmag/issues/06/01/UnitTesting/default.aspx" target="_blank">
						<font color="#002c99">转到英文页面</font>
				</a>
		</p>
<img src ="http://www.cppblog.com/mzty/aggbug/8628.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2006-06-16 11:53 <a href="http://www.cppblog.com/mzty/archive/2006/06/16/8628.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用 Visual Studio 2005 Team System 进行单元测试</title><link>http://www.cppblog.com/mzty/archive/2006/06/16/8626.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Fri, 16 Jun 2006 03:50:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2006/06/16/8626.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/8626.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2006/06/16/8626.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/8626.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/8626.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 使用 Visual Studio 2005 Team System 进行单元测试并生成用于 Unit Test Framework 的源代码						发布日期： 11/10/2005 | 更新日期： 11/10/2005						Scott DockendorfTelligent Systems, Inc.				适用于：Microsoft Visual Studio ...&nbsp;&nbsp;<a href='http://www.cppblog.com/mzty/archive/2006/06/16/8626.html'>阅读全文</a><img src ="http://www.cppblog.com/mzty/aggbug/8626.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2006-06-16 11:50 <a href="http://www.cppblog.com/mzty/archive/2006/06/16/8626.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用 Visual Studio Team Test 进行单元测试</title><link>http://www.cppblog.com/mzty/archive/2006/06/16/8624.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Fri, 16 Jun 2006 03:46:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2006/06/16/8624.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/8624.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2006/06/16/8624.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/8624.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/8624.html</trackback:ping><description><![CDATA[
		<h1>演练：使用 Visual Studio Team Test 进行单元测试</h1>
		<h2 class="subtitle">
		</h2>
		<div class="date">发布日期： 5/24/2005<span class="datePipe"> | </span>更新日期： 5/24/2005</div>
		<div class="overview">
				<p>Mark Michaelis<br />Itron Corporation</p>
				<p>
						<b>摘要：</b>本演练通过测试驱动开发 (TDD) 和先测试-后编码 (test-then-code) 的方法学习单元测试。</p>
		</div>
		<center>
				<img title="" height="6" alt="*" src="http://img.microsoft.com/library/gallery/templates/MNP2.Common/images/3squares.gif" width="30" border="0" />
		</center>
		<div style="HEIGHT: 18px">
		</div>
		<h5 style="PADDING-TOP: 2px">本页内容</h5>
		<table style="MARGIN-TOP: 7px; MARGIN-BOTTOM: 12px" cellspacing="0" cellpadding="0" border="0">
				<tbody>
						<tr valign="top">
								<td>
										<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#E4B">
												<img height="9" alt="简介" hspace="4" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width="7" vspace="2" border="0" />
										</a>
								</td>
								<td class="onThisPage">
										<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#E4B">简介</a>
								</td>
						</tr>
						<tr valign="top">
								<td>
										<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#EGD">
												<img height="9" alt="开始" hspace="4" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width="7" vspace="2" border="0" />
										</a>
								</td>
								<td class="onThisPage">
										<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#EGD">开始</a>
								</td>
						</tr>
						<tr valign="top">
								<td>
										<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#EAF">
												<img height="9" alt="创建测试" hspace="4" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width="7" vspace="2" border="0" />
										</a>
								</td>
								<td class="onThisPage">
										<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#EAF">创建测试</a>
								</td>
						</tr>
						<tr valign="top">
								<td>
										<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#EVCAC">
												<img height="9" alt="运行测试" hspace="4" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width="7" vspace="2" border="0" />
										</a>
								</td>
								<td class="onThisPage">
										<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#EVCAC">运行测试</a>
								</td>
						</tr>
						<tr valign="top">
								<td>
										<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#EHGAC">
												<img height="9" alt="检查异常" hspace="4" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width="7" vspace="2" border="0" />
										</a>
								</td>
								<td class="onThisPage">
										<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#EHGAC">检查异常</a>
								</td>
						</tr>
						<tr valign="top">
								<td>
										<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#EXIAC">
												<img height="9" alt="从数据库中加载测试数据" hspace="4" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width="7" vspace="2" border="0" />
										</a>
								</td>
								<td class="onThisPage">
										<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#EXIAC">从数据库中加载测试数据</a>
								</td>
						</tr>
						<tr valign="top">
								<td>
										<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#EJJAC">
												<img height="9" alt="测试视图 (Test View) 窗口" hspace="4" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width="7" vspace="2" border="0" />
										</a>
								</td>
								<td class="onThisPage">
										<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#EJJAC">测试视图 (Test View) 窗口</a>
								</td>
						</tr>
						<tr valign="top">
								<td>
										<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#EMLAC">
												<img height="9" alt="增加一个测试数据库" hspace="4" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width="7" vspace="2" border="0" />
										</a>
								</td>
								<td class="onThisPage">
										<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#EMLAC">增加一个测试数据库</a>
								</td>
						</tr>
						<tr valign="top">
								<td>
										<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#E2OAC">
												<img height="9" alt="将数据与测试关联" hspace="4" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width="7" vspace="2" border="0" />
										</a>
								</td>
								<td class="onThisPage">
										<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#E2OAC">将数据与测试关联</a>
								</td>
						</tr>
						<tr valign="top">
								<td>
										<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#EGDAE">
												<img height="9" alt="实现和重构目标方法" hspace="4" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width="7" vspace="2" border="0" />
										</a>
								</td>
								<td class="onThisPage">
										<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#EGDAE">实现和重构目标方法</a>
								</td>
						</tr>
						<tr valign="top">
								<td>
										<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#EDEAE">
												<img height="9" alt="代码覆盖" hspace="4" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width="7" vspace="2" border="0" />
										</a>
								</td>
								<td class="onThisPage">
										<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#EDEAE">代码覆盖</a>
								</td>
						</tr>
						<tr valign="top">
								<td>
										<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#EXEAE">
												<img height="9" alt="初始化和清除测试" hspace="4" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width="7" vspace="2" border="0" />
										</a>
								</td>
								<td class="onThisPage">
										<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#EXEAE">初始化和清除测试</a>
								</td>
						</tr>
						<tr valign="top">
								<td>
										<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#EHHAE">
												<img height="9" alt="最佳实践" hspace="4" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width="7" vspace="2" border="0" />
										</a>
								</td>
								<td class="onThisPage">
										<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#EHHAE">最佳实践</a>
								</td>
						</tr>
						<tr valign="top">
								<td>
										<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#EAIAE">
												<img height="9" alt="小结" hspace="4" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width="7" vspace="2" border="0" />
										</a>
								</td>
								<td class="onThisPage">
										<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#EAIAE">小结</a>
								</td>
						</tr>
				</tbody>
		</table>
		<a name="E4B">
		</a>
		<h2>简介</h2>
		<p>最新发布的 Visual Studio Test System (VSTS) 包含了一套用于 Visual Studio Team Test 的完整功能。Team Test 是 Visual Studio 集成的单元测试框架，它支持：</p>
		<table cellspacing="0" cellpadding="0" border="0">
				<tbody>
						<tr>
								<td class="listBullet" valign="top">•</td>
								<td class="listItem">
										<p>测试方法存根 (stub) 的代码生成。</p>
								</td>
						</tr>
						<tr>
								<td class="listBullet" valign="top">•</td>
								<td class="listItem">
										<p>在 IDE 中运行测试。</p>
								</td>
						</tr>
						<tr>
								<td class="listBullet" valign="top">•</td>
								<td class="listItem">
										<p>合并从数据库中加载的测试数据。</p>
								</td>
						</tr>
						<tr>
								<td class="listBullet" valign="top">•</td>
								<td class="listItem">
										<p>测试运行完成后，进行代码覆盖分析。 </p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>另外，Team Test 包含了一套测试功能，可以同时支持开发人员和测试人员。</p>
		<p>在本文中，我们准备演练如何创建Team Test 的单元测试。我们从一个简单的示例程序集开始，然后在该程序集中生成单元测试方法存根。这样可以为Team Test 和单元测试的新手读者提供基本的语法和代码，同时也很好地介绍了如何快速建立测试项目的结构。然后，我们转到使用测试驱动开发 (test driven development, TDD) 方法，即在写产品代码前先写单元测试。</p>
		<p>Team Test的一个关键特点是从数据库中加载测试数据，然后将其用于测试方法。在演示基本的单元测试后，我们描述如何创建测试数据并集成到测试中。</p>
		<p>本文中使用的示例项目包含一个 LongonInfo 类，它封装了与登录相关的数据（例如用户名和密码）以及一些关于数据的简单的验证规则。最终的类如下图 1 所示。</p>
		<div style="WIDTH: 152px">
				<img height="239" alt="" src="http://www.microsoft.com/china/msdn/library/langtool/vsts/art/vstsunittesting-fig1.gif" width="152" border="0" />
				<br />
				<p class="figureCaption">
						<b>图</b>
						<b>
						</b>
						<b>1. </b>
						<b>最终的</b>
						<b>
						</b>
						<b>LogonInfo</b>
						<b>
						</b>
						<b>类</b>
				</p>
				<div class="figureRule">
				</div>
		</div>
		<p>请注意所有的测试代码位于一个单独的项目。这是有道理的，产品代码应该尽可能少的受测试代码影响，所以我们不想在产品代码的程序集中嵌入测试代码。</p>
		<div style="MARGIN-TOP: 3px; MARGIN-BOTTOM: 10px">
				<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#top">
						<img height="9" alt="返回页首" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width="7" border="0" />
				</a>
				<a class="topOfPage" href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#top">返回页首</a>
		</div>
		<a name="EGD">
		</a>
		<h2>开始</h2>
		<p>首先，我们创建一个名为“VSTSDemo”的类库项目。默认情况下，<b>为方案创建目录</b><b></b>(<b>Create directory for solution</b><b>) </b>复选框被选中。保留此选项可以使我们在 VSTSDemo 项目的同一层目录创建测试项目。相反，如果不选中此选项，Visual Studio 2005 会将测试项目放在 VSTSDemo 项目的子目录中。测试项目遵循 Visual Studio 在解决方案文件路径的子目录中创建额外项目的规定。</p>
		<p>创建初始的 VSTSDemo 项目后，我们使用 Visual Studio 的解决方案资源管理器将 Class1.cs 文件重命名为 <i>LogonInfo.cs</i>，这样类名也会被更新为 <b>LogonInfo</b>。然后我们修改构造函数以接受两个字符串参数：<b>userId</b> 和 <b>password</b>。一旦构造函数的签名被声明，我们就可以为构造函数生成测试。</p>
		<div style="WIDTH: 356px">
				<img height="469" alt="" src="http://www.microsoft.com/china/msdn/library/langtool/vsts/art/vstsunittesting-fig2.gif" width="356" border="0" />
				<br />
				<p class="figureCaption">
						<b>图</b>
						<b>
						</b>
						<b>2. </b>
						<b>LongonInfo </b>
						<b>构造函数的上下文菜单的“创建测试</b>
						<b>…</b>
						<b>”</b>
						<b> (</b>
						<b>Create Tests...</b>
						<b>) </b>
						<b>菜单项</b>
				</p>
				<div class="figureRule">
				</div>
		</div>
		<div style="MARGIN-TOP: 3px; MARGIN-BOTTOM: 10px">
				<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#top">
						<img height="9" alt="返回页首" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width="7" border="0" />
				</a>
				<a class="topOfPage" href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#top">返回页首</a>
		</div>
		<a name="EAF">
		</a>
		<h2>创建测试</h2>
		<p>在开始编写 <b>LogonInfo</b><b></b>的任何实现之前，我们遵循 TDD 实践的规则，首先编写测试。TDD 在Team Test 中并不是必需的，但最好在本文的剩余部分遵循 TDD。右键单击 <b>LogonInfo()</b><b></b>构造函数，然后选择“创建测试…”菜单项(如图 2 所示)。这样会出现一个对话框，可以在不同的项目中生成单元测试（如图 3 所示）。默认情况下，项目设置的输出 (Output) 选项是一个新的 Visual Basic 项目，但是也可以选择 C# 和 C++ 测试项目。在本文中，我们选择 Visual C#，然后单击 <b>OK </b>按钮，接着输入项目名 <i>VSTSDemo.Test</i>。测试项目名称。</p>
		<div style="WIDTH: 464px">
				<img height="433" alt="" src="http://www.microsoft.com/china/msdn/library/langtool/vsts/art/vstsunittesting-fig3.gif" width="464" border="0" />
				<br />
				<p class="figureCaption">
						<b>图</b>
						<b>
						</b>
						<b>3. </b>
						<b>生成单元测试对话框</b>
				</p>
				<div class="figureRule">
				</div>
		</div>
		<p>生成的测试项目包含四个与测试相关的文件。</p>
		<table class="dataTable" id="EDG" cellspacing="0" cellpadding="0">
				<thead>
						<tr class="stdHeader" valign="top">
								<td id="colEFG">文件名</td>
								<td id="colEJG" style="BORDER-RIGHT: #cccccc 1px solid">目的</td>
						</tr>
				</thead>
				<tbody>
						<tr class="record" valign="top">
								<td>
										<p class="lastInCell">AuthoringTest.txt</p>
								</td>
								<td style="BORDER-RIGHT: #cccccc 1px solid">
										<p class="lastInCell">提供关于创建测试的说明，包括向项目增加其他测试的说明。</p>
								</td>
						</tr>
						<tr class="evenRecord" valign="top">
								<td>
										<p class="lastInCell">LogonInfoTest.cs</p>
								</td>
								<td style="BORDER-RIGHT: #cccccc 1px solid">
										<p class="lastInCell">包含了用于测试 <b>LogonInfo()</b><b></b>的生成测试，以及测试初始化和测试清除的方法。</p>
								</td>
						</tr>
						<tr class="record" valign="top">
								<td>
										<p class="lastInCell">ManualTest1.mht</p>
								</td>
								<td style="BORDER-RIGHT: #cccccc 1px solid">
										<p class="lastInCell">提供了一个模板，可以填入手工测试的指令。</p>
								</td>
						</tr>
						<tr class="evenRecord" valign="top">
								<td>
										<p class="lastInCell">UnitTest1.cs</p>
								</td>
								<td style="BORDER-RIGHT: #cccccc 1px solid">
										<p class="lastInCell">一个空的单元测试类架构，用于放入另外的单元测试。</p>
								</td>
						</tr>
				</tbody>
		</table>
		<div class="dataTableBottomMargin">
		</div>
		<p>因为我们不打算对该项目进行手工测试，并且由于已经有了一个单元测试文件，我们将删除 ManualTest1.mht 和 UnitTest1.cs。</p>
		<p>除了一些默认的文件，生成的测试项目还包含了对 Microsoft.VisualStudio.QualityTools.UnitTestFramework和 VSTSDemo 项目的引用。前者是测试引擎运行单元测试需要依赖的测试框架程序集，后者是对我们需要测试的目标程序集的项目引用。</p>
		<p>默认情况下，生成的测试方法是包含以下实现的占位符：</p>
		<p>
				<b>清单</b>
				<b> 1. </b>
				<b>生成的测试方法：</b>
				<b>ConstructorTest(),</b>
				<b>
				</b>
				<b>位于</b>
				<b>VSTSDemo.Test.LogonInfoTest</b>
		</p>
		<pre class="codeSample">   
/// &lt;summary&gt;
   ///This is a test class for VSTTDemo.LogonInfo and is intended
   ///to contain all VSTTDemo.LogonInfo Unit Tests
   ///&lt;/summary&gt;
   [TestClass()]
   public class LogonInfoTest
   {
      // ...

      /// &lt;summary&gt;
      ///A test case for LogonInfo (string, string)
      ///&lt;/summary&gt;
      [TestMethod()]
      public void ConstructorTest()
      {
         string userId = null; // TODO: Initialize to an appropriate value

         string password = null; // TODO: Initialize to an appropriate value

         LogonInfo target = new LogonInfo(userId, password);

         // TODO: Implement code to verify target
         Assert.Inconclusive(
            "TODO: Implement code to verify target");
      }
}
</pre>
		<p>确切的生成代码会根据测试目标的方法类型和签名不同而有所不同。例如，向导会为私有成员函数的测试生成反射代码。在这种特别的情况下，我们需要专门用于公有构造函数测试的代码。</p>
		<p>关于Team Test ，有两个重要的特性。首先，作为测试的方法由 <b>TestMethodAttribute</b><b></b>属性指定，另外，包含测试方法的类有 <b>TestClassAttribute</b><b></b>属性。这些属性都可以在 Microsoft.VisualStudio.QualityTools.UnitTesting.Framework 命名空间中找到。Team Test 使用反射机制在测试程序集中搜索所有由 <b>TestClass</b><b></b>修饰的类，然后查找由 <b>TestMethodAttribute</b><b></b>修饰的方法来决定执行的内容。另外一个重要的由执行引擎而不是编译器验证的标准是，测试方法的签名必须是无参数的实例方法。因为反射搜索 <b>TestMethodAttribute</b>，所以测试方法可以使用任意的名字。</p>
		<p>测试方法 <b>ConstructorTest()</b><b></b>首先实例化目标 LongonInfo 类，然后断言测试是非决定性的(使用<b>Assert.Inconclusive()</b>)。当测试运行时，<b>Assert.Inconclusive()</b><b></b>说明了它可能缺少正确的实现。在我们的示例中，我们更新 <b>ConstructorTest()</b><b></b>方法，让它检查用户名和密码的初始化，如下所示。</p>
		<p>
				<b>清单</b>
				<b>
				</b>
				<b>2. </b>
				<b>更新的</b>
				<b>
				</b>
				<b>ConstructorTest()</b>
				<b>
				</b>
				<b>实现</b>
		</p>
		<pre class="codeSample">      
/// &lt;summary&gt;
      ///A test case for LogonInfo (string, string)
      ///&lt;/summary&gt;
      [TestMethod()]
      public void ConstructorTest()
      {
         string userId = "IMontoya";

         string password = "P@ssw0rd";

         LogonInfo logonInfo = new LogonInfo(userId, password);

         Assert.AreEqual&lt;string&gt;(userId, logonInfo.UserId,
            "The UserId was not correctly initialized.");
         Assert.AreEqual&lt;string&gt;(password, logonInfo.Password,
            "The Password was not correctly initialized.");
      }
</pre>
		<p>请注意我们的检查使用 <b>Assert.AreEqual&lt;T&gt;(</b><b>) </b>方法完成。<b>Assert</b><b></b>方法也支持没有泛型的 <b>AreEqual()</b>，但是泛型版本几乎总是首选，因为它会在编译时验证类型匹配 － 在 CLR 支持泛型前，这种错误在单元测试框架中非常普遍。</p>
		<p>因为 UserID 和 Password 的实例域还没有创建，我们需要回头将其添加到 <b>LogonInfo</b><b></b>类中，以便VSTTDemo.Test 项目可以编译。</p>
		<p>即使我们还没有一个有效的实现，让我们开始运行测试。如果我们遵循 TDD 方法，我们就应该直到测试证明我们需要这样的代码时才去编写产品代码。我们仅在建立项目结构时违背此原则，但是一旦项目建立后，就可以容易地始终遵循 TDD 方法。</p>
		<div style="MARGIN-TOP: 3px; MARGIN-BOTTOM: 10px">
				<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#top">
						<img height="9" alt="返回页首" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width="7" border="0" />
				</a>
				<a class="topOfPage" href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#top">返回页首</a>
		</div>
		<a name="EVCAC">
		</a>
		<h2>运行测试</h2>
		<p>要运行项目中的所有测试，只需要运行测试项目。要实现这一点，我们需要右键单击解决方案资源管理器的VSTSDemo.Test 项目，选择<b>设置为启动项目</b><b></b>(<b>Set as StartUp Project</b><b>)</b>。接着，使用菜单项<b>调试</b><b>-&gt;</b><b>启动</b><b></b><b>(</b><b>F5</b><b>) </b>或者<b>调试</b><b>-&gt;</b><b>开始执行（不调试）</b><b>(</b><b>Ctrl+F5</b><b>) </b>开始运行测试。</p>
		<p>这时出现测试结果窗口，列出项目中的所有测试。因为我们的项目只包含一个测试，因此只列出了一个测试。开始的时候，测试会处于挂起的状态，但是一旦测试完成，结果将是我们意料中的失败（如图 4 所示）。</p>
		<div style="WIDTH: 464px">
				<img height="182" alt="" src="http://www.microsoft.com/china/msdn/library/langtool/vsts/art/vstsunittesting-fig4.gif" width="464" border="0" />
				<br />
				<p class="figureCaption">
						<b>图</b>
						<b> 4. </b>
						<b>执行所有测试后的测试结果窗口</b>
				</p>
				<div class="figureRule">
				</div>
		</div>
		<p>图 4 显示了<b>测试结果</b><b> (Test Results) </b>窗口。这个特别的屏幕快照除了默认的列外，还显示了错误信息。您可以在列头上单击右键并选择菜单项<b>增加</b><b>/</b><b>删除列…</b>以增加或者删除列。</p>
		<p>如果要查看测试的额外细节，我们可以选定测试并双击，打开“ConstructorTest[Results]”窗口，如图 5 所示。</p>
		<div style="WIDTH: 463px">
				<img height="300" alt="" src="http://www.microsoft.com/china/msdn/library/langtool/vsts/art/vstsunittesting-fig5.gif" width="463" border="0" />
				<br />
				<p class="figureCaption">
						<b>图</b>
						<b> 5. </b>
						<b>详细的测试</b>
						<b>
						</b>
						<b>ConstructorTest [</b>
						<b>Results</b>
						<b>]</b>
						<b>
						</b>
						<b>窗口</b>
				</p>
				<div class="figureRule">
				</div>
		</div>
		<p>另外，我们可以右键单击单个测试，然后选择<b>打开测试</b><b></b>(<b>Open Test) </b>菜单项，进入测试代码。因为我们已经知道问题在于 LogonInfo 构造函数的实现，我们可以去那里编写初始化 <b>UserID </b>和 <b>Password </b><b>字段</b>的代码，使用传入的参数对它们进行初始化。重新运行测试以验证测试现在可以通过。</p>
		<div style="MARGIN-TOP: 3px; MARGIN-BOTTOM: 10px">
				<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#top">
						<img height="9" alt="返回页首" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width="7" border="0" />
				</a>
				<a class="topOfPage" href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#top">返回页首</a>
		</div>
		<a name="EHGAC">
		</a>
		<h2>检查异常</h2>
		<p>下一步是创建 <b>LongonInfo </b>类，以提供对 UserID 和 password 的一些验证。不幸的是，<b>UserID</b>和 <b>Password </b>字段是公共的，这意味着它们没有提供任何封装来确保它们有效。但是在我们将其转换为属性并提供验证前，让我们编写一些测试来验证任何实现的结果都是正确的。</p>
		<p>我们首先来编写一个测试，防止空值 (null) 或空字符串赋值给 UserID。预期结果是，如果空值传送给构造函数，会引发一个 <b>ArgumentException</b><b></b>异常。测试代码如清单 3 所示。</p>
		<p>
				<b>清单</b>
				<b>
				</b>
				<b>3. </b>
				<b>使用</b>
				<b>
				</b>
				<b>ExpectedExceptionAttribute</b>
				<b>
				</b>
				<b>对异常情况进行测试</b>
		</p>
		<pre class="codeSample">      
[TestMethod]
      [ExpectedException(typeof(ArgumentException),
         "A userId of null was inappropriately allowed.")]
      public void NullUserIdInConstructor()
      {
         LogonInfo logonInfo = new LogonInfo(null, "P@ss0word");
      }

      [TestMethod]
      [ExpectedException(typeof(ArgumentException),
         "A empty userId was inappropriately allowed.")]
      public void EmptyUserIdInConstructor()
      {
         LogonInfo logonInfo = new LogonInfo("", "P@ss0word");
      }
</pre>
		<p>请注意对于 <b>ArgumentException</b><b></b>没有 try-catch 代码块的显式测试。不过，两个测试都包含另外一个属性 <b>ExpectedException</b>，它接受一个类型参数，以及一个可选的错误信息，用于在没有引发异常时显示。当这个单元测试执行时，测试框架会显式地监视引发的 <b>ArgumentException</b><b></b>异常，如果方法没有引发这个异常，测试将失败。运行这些测试会证明我们还没有对 UserID 做任何验证检查；因此，测试会失败，因为没有引发预期的异常。</p>
		<p>有了失败的测试，现在可以回到产品代码进行更新来提供测试需要检查的功能。在这个例子中，我们将 UserID字段转换为属性，并提供验证检查（清单 4）。</p>
		<p>
				<b>清单</b>
				<b>
				</b>
				<b>4. </b>
				<b>在</b>
				<b>
				</b>
				<b>LogonInfo</b>
				<b>
				</b>
				<b>类中验证</b>
				<b>
				</b>
				<b>UserId</b>
		</p>
		<pre class="codeSample">   
public class LogonInfo
   {
      public LogonInfo(string userId, string password)
      {
         this.UserId = userId;
         this.Password = password;
      }

      private string _UserId;
      public string UserId
      {
         get { return _UserId; }
         private set
         {
            if (value == null || value.Trim() == string.Empty)
            {
               throw new ArgumentException(
                  "Parameter userId may not be null or blank.");
            }
            _UserId = value;
         }
      }
      
      // ...
}
</pre>
		<p>属性的实现使用了 C# 2.0 的功能，其中 getter 和 setter 的访问权限不一致。setter的实现标识为私有，而 getter 实现为公有。这样 UserID 就不能在 LogonInfo 类外被修改了（除非通过反射机制）。</p>
		<p>一旦增加了验证，我们可以重新运行测试来验证实现是正确的。我们运行所有的三个测试来验证 UserID 字段转换为属性的重构过程没有产生任何意外的错误。单元测试的真正价值在代码修改的时候才真正有所体现。一套单元测试可以保证我们在维护和改进代码的时候没有破坏代码。</p>
		<div style="MARGIN-TOP: 3px; MARGIN-BOTTOM: 10px">
				<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#top">
						<img height="9" alt="返回页首" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width="7" border="0" />
				</a>
				<a class="topOfPage" href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#top">返回页首</a>
		</div>
		<a name="EXIAC">
		</a>
		<h2>从数据库中加载测试数据</h2>
		<p>对于 <b>LogonInfo </b>类的下一次修改，我们将提供一个方法来改变密码。该方法接受旧密码和新密码作为参数。另外，我们会验证密码符合某种复杂性需求。确切的说，我们将保证密码符合 Windows Active Directory 的默认需求，即包含以下四种类型字符中的三种：</p>
		<table cellspacing="0" cellpadding="0" border="0">
				<tbody>
						<tr>
								<td class="listBullet" valign="top">•</td>
								<td class="listItem">
										<p>大写字母 </p>
								</td>
						</tr>
						<tr>
								<td class="listBullet" valign="top">•</td>
								<td class="listItem">
										<p>小写字母</p>
								</td>
						</tr>
						<tr>
								<td class="listBullet" valign="top">•</td>
								<td class="listItem">
										<p>标点符号</p>
								</td>
						</tr>
						<tr>
								<td class="listBullet" valign="top">•</td>
								<td class="listItem">
										<p>数字</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>另外，我们将检查密码最少包含 6 个字符，最多包含 255 个字符。</p>
		<p>和之前一样，我们在编写实现前先为密码复杂性需求编写测试。但是显然，我们需要提供一个测试值的大集合用于验证实现。我们不是为每个测试用例创建一个单独的测试，也不是创建一个循环来调用一系列的测试用例，我们将创建一个数据驱动测试，它从数据库中取出所需的数据。</p>
		<div style="MARGIN-TOP: 3px; MARGIN-BOTTOM: 10px">
				<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#top">
						<img height="9" alt="返回页首" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width="7" border="0" />
				</a>
				<a class="topOfPage" href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#top">返回页首</a>
		</div>
		<a name="EJJAC">
		</a>
		<h2>测试视图 (Test View) 窗口</h2>
		<p>首先我们定义一个名为 <b>ChangePasswordTest()</b> 的新测试。定义后，从菜单项<b>测试</b><b>-&gt;</b><b>查看和创建测试</b><b>(</b><b>Test-&gt;View and Author Tests</b><b>)</b>为测试方法打开<b>测试视图</b>窗口，如图 6 所示：</p>
		<div style="WIDTH: 325px">
				<img height="352" alt="" src="http://www.microsoft.com/china/msdn/library/langtool/vsts/art/vstsunittesting-fig6.gif" width="325" border="0" />
				<br />
				<p class="figureCaption">
						<b>图</b>
						<b>
						</b>
						<b>6. </b>
						<b>测试视图</b>
						<b> (</b>
						<b>Test view</b>
						<b>) </b>
						<b>窗口</b>
				</p>
				<div class="figureRule">
				</div>
		</div>
		<p>测试视图窗口可用来运行指定的测试和浏览测试的特定属性。通过增加额外的列（右键单击列头并选择添加/删除列…），我们可以排序并根据偏好查看测试。有些列来自修饰测试的属性。例如，添加 <b>OwnerAttribute</b><b></b>将在所有者列显示测试的所有者。其它元数据属性（如 <b>DescriptionAttribute</b><b>）</b>也可以使用。这些属性都可以在 Microsoft.VisualStudio.QualityTools.UnitTesting.Framework 命名空间中找到。如果没有显式的属性存在，那么我们可以使用自由形式的 <b>TestPropertyAttribute</b><b></b>来为特别的测试方法增加名－值对。</p>
		<p>没有对应列的属性可以在一个测试的属性窗口中显示（选择一个测试，在右键上下文菜单中单击<b>属性</b>）。它包含了指定数据连接字符串和用于载入测试数据的表名的属性。显然，为了指定有效值，我们需要一个数据库连接。</p>
		<div style="MARGIN-TOP: 3px; MARGIN-BOTTOM: 10px">
				<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#top">
						<img height="9" alt="返回页首" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width="7" border="0" />
				</a>
				<a class="topOfPage" href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#top">返回页首</a>
		</div>
		<a name="EMLAC">
		</a>
		<h2>增加一个测试数据库</h2>
		<p>从服务器资源管理器窗口，我们可以使用<b>创建新的</b><b> SQL Server</b><b>数据库</b><b></b>(<b>Create new SQL Server Database</b><b>) </b>菜单项。但是要小心这种方法，如果我们要在其它计算机上执行测试的话，我们要保证在一台服务器上创建数据库，其它可能执行测试的计算机必须能够访问该服务器 — 例如一台用于构建的计算机。</p>
		<p>另外一个选择是仅仅增加一个数据库文件。使用<b>项目</b><b>-&gt;</b><b>增加新项</b><b>…</b> (<b>Project-&gt;Add new item...</b><b>)</b> 允许向项目插入一个 SQL 数据库文件。这种方法使测试数据和测试项目保持在一起。缺点是如果数据库变得很大，我们就不想这么做，而宁可提供全局的数据源。</p>
		<p>对于本项目中的数据，我们创建一个名为 <i>VSTSDemo.mdf</i><i></i>的本地项目数据库文件。为了向文件加入测试数据，我们使用菜单<b>工具</b><b>-&gt;</b><b>连接到数据库</b><b> (</b><b>Tools-&gt;Connect to Database</b><b>)</b>，然后指定 VSTSDemo.mdf 文件。然后，从服务器资源管理器窗口我们可以使用设计器加入一个新的表 <b>LongonInfoTest</b>。清单 5 显示了该表的定义。</p>
		<p>
				<b>清单</b>
				<b>
				</b>
				<b>5. LogonInfoTestData SQL </b>
				<b>脚本</b>
		</p>
		<pre class="codeSample">CREATE TABLE dbo.LogonInfoTest
   (
   UserId nchar(256) NOT NULL PRIMARY KEY CLUSTERED,
   Password nvarchar(256) NULL,
   IsValid bit NOT NULL
   )  ON [PRIMARY]
GO
</pre>
		<p>保存表后，我们可以将其打开，然后输入不同的非法密码，如下表所示。</p>
		<table class="dataTable" id="EQNAC" cellspacing="0" cellpadding="0">
				<thead>
						<tr class="stdHeader" valign="top">
								<td id="colESNAC">UserId</td>
								<td id="colEWNAC">Password</td>
								<td id="colE1NAC" style="BORDER-RIGHT: #cccccc 1px solid">IsValid</td>
						</tr>
				</thead>
				<tbody>
						<tr class="record" valign="top">
								<td>
										<p class="lastInCell">Humperdink</p>
								</td>
								<td>
										<p class="lastInCell">P@w0d</p>
								</td>
								<td style="BORDER-RIGHT: #cccccc 1px solid">
										<p class="lastInCell">False</p>
								</td>
						</tr>
						<tr class="evenRecord" valign="top">
								<td>
										<p class="lastInCell">IMontoya</p>
								</td>
								<td>
										<p class="lastInCell">p@ssword</p>
								</td>
								<td style="BORDER-RIGHT: #cccccc 1px solid">
										<p class="lastInCell">False</p>
								</td>
						</tr>
						<tr class="record" valign="top">
								<td>
										<p class="lastInCell">Inigo.Montoya</p>
								</td>
								<td>
										<p class="lastInCell">P@ssw0rd</p>
								</td>
								<td style="BORDER-RIGHT: #cccccc 1px solid">
										<p class="lastInCell">False</p>
								</td>
						</tr>
						<tr class="evenRecord" valign="top">
								<td>
										<p class="lastInCell">Wesley</p>
								</td>
								<td>
										<p class="lastInCell">Password</p>
								</td>
								<td style="BORDER-RIGHT: #cccccc 1px solid">
										<p class="lastInCell">False</p>
								</td>
						</tr>
				</tbody>
		</table>
		<div class="dataTableBottomMargin">
		</div>
		<div style="MARGIN-TOP: 3px; MARGIN-BOTTOM: 10px">
				<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#top">
						<img height="9" alt="返回页首" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width="7" border="0" />
				</a>
				<a class="topOfPage" href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#top">返回页首</a>
		</div>
		<a name="E2OAC">
		</a>
		<h2>将数据与测试关联</h2>
		<p>一旦完成表的创建，我们需要将其与测试 <b>InvalidPasswords()</b><b></b>联系起来。从测试 <b>InvalidPasswords</b>的属性窗口，我们填写<b>数据连接字符串</b><b></b><b>(</b><b>Data Connection String</b><b>) </b>和<b>数据表名</b><b> (</b><b>Data Table Name</b><b>) </b>属性。这样做将使用附加的属性 <b>DataSourceAttribute</b><b></b>和 <b>DataTableNameAttribute</b><b></b>更新测试。最终的方法 <b>ChangePasswordTest()</b><b></b>在清单 6 中显示。</p>
		<p>
				<b>清单</b>
				<b>
				</b>
				<b>6. </b>
				<b>用于数据驱动测试的测试代码</b>
		</p>
		<pre class="codeSample">      
enum Column
      {
         UserId,
         Password,
         IsValid
      }

      private TestContext testContextInstance;

      /// &lt;summary&gt;
      ///Gets or sets the test context which provides
      ///information about and functionality for the 
      ///current test run.
      ///&lt;/summary&gt;
      public TestContext TestContext
      {
         get
         {
            return testContextInstance;
         }
         set
         {
            testContextInstance = value;
         }
      }

      [TestMethod]
      [Owner("Mark Michaelis")]
      [TestProperty("TestCategory", "Developer"), 
      DataSource("System.Data.SqlClient", 
         "Data Source=.\\SQLEXPRESS;AttachDbFilename=\"&lt;Path to the sample .mdf file&gt;";Integrated <br />Security=True", 
         "LogonInfoTest", 
         DataAccessMethod.Sequential)]
      public void ChangePasswordTest()
      {
         
         string userId = 
            (string)TestContext.DataRow[(int)Column.UserId];
         string password = 
            (string)TestContext.DataRow[(int)Column.Password];
         bool isValid = 
            (bool)TestContext.DataRow[(int)Column.IsValid];

         LogonInfo logonInfo = new LogonInfo(userId, "P@ssw0rd");

         if (!isValid)
         {
            Exception exception = null;
            try
            {
               logonInfo.ChangePassword(
                  "P@ssw0rd", password);
            }
            catch (Exception tempException)
            {
               exception = tempException;
            }
            Assert.IsNotNull(exception,
               "The expected exception was not thrown.");
            Assert.AreEqual&lt;Type&gt;(
               typeof(ArgumentException), exception.GetType(),
               "The exception type was unexpected.");
         }
         else
         {
            logonInfo.ChangePassword(
               "P@ssw0rd", password);
            Assert.AreEqual&lt;string&gt;(password, logonInfo.Password,
               "The password was not changed.");
         }
      }
</pre>
		<p>清单 6 第一个需要注意的地方是增加了 <b>DataSourceAttribute</b><b></b>属性，它指明了连接字符串、表名和访问顺序。在这个清单中，我们使用数据库文件名标识数据库。这样的优点是该文件和测试项目一起迁移，假设它可能会被移动到一个相对的路径。</p>
		<p>第二个注意的地方是 <b>TestContext.DataRow</b><b></b>调用。<b>TestContext</b><b></b>是在我们运行创建测试向导时由生成器提供的属性，它在运行时由测试执行引擎自动赋值，这样我们就可以在测试中访问跟测试环境关联的数据。如图 7 所示。</p>
		<div style="WIDTH: 462px">
				<img height="406" alt="" src="http://www.microsoft.com/china/msdn/library/langtool/vsts/art/vstsunittesting-fig7.gif" width="462" border="0" />
				<br />
				<p class="figureCaption">
						<b>图</b>
						<b> 7. TestContext </b>
						<b>关联</b>
				</p>
				<div class="figureRule">
				</div>
		</div>
		<p>如图 7 所示，<b>TestContext</b><b></b>提供了 <b>TestDirectory</b><b></b>和 <b>TestName</b><b></b>数据，以及 <b>BeginTimer()</b><b></b>和<b>EndTimer()</b><b></b>方法。对 <b>ChangePasswordTest()</b><b></b>方法最有意义的是 <b>DataRow</b><b></b>属性。因为 <b>ChangePasswordTest()</b><b></b><b>方法</b>由 <b>DataSourceAttribute</b><b></b>修饰，该属性指定的表返回每个记录时，该方法都会被调用一次。这就使测试代码使用运行中的测试的数据，而且对插入 LongonInfoTest 表的每条记录重复执行测试。如果表包含四条记录，那么测试将会分别执行四次。</p>
		<p>使用这样的数据驱动测试方法，可以很容易的提供额外的测试数据，而不需要编写任何代码。一旦需要额外的测试用例，我们需要做的就是向 LongonInfoTest 表增加关联的数据。尽管我们可以创建两个独立的测试来使用单独的表分别测试有效和无效数据，这个特定的例子合并了这些测试来显示稍微复杂的数据测试实例。</p>
		<div style="MARGIN-TOP: 3px; MARGIN-BOTTOM: 10px">
				<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#top">
						<img height="9" alt="返回页首" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width="7" border="0" />
				</a>
				<a class="topOfPage" href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#top">返回页首</a>
		</div>
		<a name="EGDAE">
		</a>
		<h2>实现和重构目标方法</h2>
		<p>现在我们已经有了测试，是时候为测试编写实现了。使用 C# 重构工具，我们可以右键单击 <b>ChangePassword()</b>方法调用，选择菜单<b>项</b><b>GenerateMethodStub</b>，然后对于生成的方法提供实现，一旦我们成功地运行了使用所有测试数据的测试，我们也可以开始重构代码了，<b>LogonInfo </b>类的最终实现如清单 7 所示。</p>
		<p>
				<b>清单</b>
				<b>
				</b>
				<b>7. LogonInfo</b>
				<b>
				</b>
				<b>类</b>
		</p>
		<pre class="codeSample">using System;
using System.Text.RegularExpressions;

namespace VSTTDemo
{
   public class LogonInfo
   {
      public LogonInfo(string userId, string password)
      {
         this.UserId = userId;
         this.Password = password;
      }

      private string _UserId;
      public string UserId
      {
         get { return _UserId; }
         private set
         {
            if (value == null || value.Trim() == string.Empty)
            {
               throw new ArgumentException(
                  "Parameter userId may not be null or blank.");
            }
            _UserId = value;
         }
      }

      private string _Password;
      public string Password
      {
         get { return _Password; }
         private set
         {
            string errorMessage;
            if (!IsValidPassword(value, out errorMessage))
            {
               throw new ArgumentException(
                  errorMessage);
            }
            _Password = value;
         }
      }

      public static bool IsValidPassword(string value, 
         out string errorMessage)
      {
         const string passwordSizeRegex = "(?=^.{6,255}$)";
         const string uppercaseRegex = "(?=.*[A-Z])";
         const string lowercaseRegex = "(?=.*[a-z])";
         const string punctuationRegex = @"(?=.*\d)";
         const string upperlowernumericRegex = "(?=.*[^A-Za-z0-9])";

         bool isValid;
         Regex regex = new Regex(
            passwordSizeRegex +
            "(" + punctuationRegex + uppercaseRegex + lowercaseRegex +
               "|" + punctuationRegex + upperlowernumericRegex + lowercaseRegex +
               "|" + upperlowernumericRegex + uppercaseRegex + lowercaseRegex +
               "|" + punctuationRegex + uppercaseRegex + upperlowernumericRegex +
            ")^.*");

         if (value == null || value.Trim() == string.Empty)
         {
            isValid = false;
            errorMessage = "Password may not be null or blank.";
         }
         else
         {
            if (regex.Match(value).Success)
            {
               isValid = true;
               errorMessage = "";
            }
            else
            {
               isValid = false;
               errorMessage = "Password does not meet the complexity requirements.";
            }
         }
         return isValid;
      }

      public void ChangePassword(
         string oldPassword, string newPassword)
      {
         if (oldPassword == Password)
         {
            Password = newPassword;
         }
         else
         {
            throw new ArgumentException(
               "The old password was not correct.");
         }
      }
   }
}
</pre>
		<div style="MARGIN-TOP: 3px; MARGIN-BOTTOM: 10px">
				<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#top">
						<img height="9" alt="返回页首" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width="7" border="0" />
				</a>
				<a class="topOfPage" href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#top">返回页首</a>
		</div>
		<a name="EDEAE">
		</a>
		<h2>代码覆盖</h2>
		<p>单元测试的一个关键度量是决定在单元测试运行时测试了多少代码。该度量称为代码覆盖，Team Test 包含了一个代码覆盖工具，可以详细解释被执行代码的百分率，并突出显示哪些代码被执行，那些没有被执行。该功能如图 8 所示。</p>
		<div style="WIDTH: 459px">
				<img height="322" alt="" src="http://www.microsoft.com/china/msdn/library/langtool/vsts/art/vstsunittesting-fig8.gif" width="459" border="0" />
				<br />
				<p class="figureCaption">
						<b>图</b>
						<b>
						</b>
						<b>8. </b>
						<b>突出显示代码覆盖</b>
				</p>
				<div class="figureRule">
				</div>
		</div>
		<p>图 8 显示了运行所有单元测试后的代码覆盖的突出显示情况。红色突出显示说明了我们有产品代码没有运行任何单元测试，这说明我们编写这些代码时未遵循 TDD 原则，即在编写实现前先提供测试。</p>
		<div style="MARGIN-TOP: 3px; MARGIN-BOTTOM: 10px">
				<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#top">
						<img height="9" alt="返回页首" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width="7" border="0" />
				</a>
				<a class="topOfPage" href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#top">返回页首</a>
		</div>
		<a name="EXEAE">
		</a>
		<h2>初始化和清除测试</h2>
		<p>一般来说，测试类不仅包含独立的测试方法，还包含了不同的对测试进行初始化和清除的方法。实际上，创建测试向导在创建 VSTSDemo.Test 项目时，将一些这样的方法添加到类 <b>LongonInfoTest </b>中，见清单 8。</p>
		<p>
				<b>清单</b>
				<b>
				</b>
				<b>8. </b>
				<b>最终的</b>
				<b>
				</b>
				<b>LogonInfoTest</b>
				<b>
				</b>
				<b>类</b>
		</p>
		<pre class="codeSample">using VSTTDemo;
using Microsoft.VisualStudio.QualityTools.UnitTesting.Framework;
using System;

namespace VSTSDemo.Test
{
   /// &lt;summary&gt;
   ///This is a test class for VSTTDemo.LogonInfo and is intended
   ///to contain all VSTTDemo.LogonInfo Unit Tests
   ///&lt;/summary&gt;
   [TestClass()]
   public class LogonInfoTest
   {

      private TestContext testContextInstance;

      /// &lt;summary&gt;
      ///Gets or sets the test context which provides
      ///information about and functionality for the 
      ///current test run.
      ///&lt;/summary&gt;
      public TestContext TestContext
      {
         get
         {
            return testContextInstance;
         }
         set
         {
            testContextInstance = value;
         }
      }

      /// &lt;summary&gt;
      ///Initialize() is called once during test execution before
      ///test methods in this test class are executed.
      ///&lt;/summary&gt;
      [TestInitialize()]
      public void Initialize()
      {
         //  TODO: Add test initialization code
      }

      /// &lt;summary&gt;
      ///Cleanup() is called once during test execution after
      ///test methods in this class have executed unless
      ///this test class' Initialize() method throws an exception.
      ///&lt;/summary&gt;
      [TestCleanup()]
      public void Cleanup()
      {
         
         //  TODO: Add test cleanup code
      }


      // ...

      [TestMethod]
      // ...
      public void ChangePasswordTest()
      {   
      // ...
      }

   }
}
</pre>
		<p>用于对测试进行设置和清除的方法分别由属性 <b>TestInitializeAttribute</b><b></b>和 <b>TestCleanupAttribute</b><b></b>修饰。在每个这样的方法中，我们可以加入额外的代码，它们将会在每个测试前或者测试后运行。这意味着在每次对应于 LongonInfoTest 表的记录的 <b>ChangePasswordTest()</b><b></b>执行前，<b>Initialize() </b>和 <b>Cleanup() </b>都会被执行，每次 <b>NullUserIdInConstructor</b><b></b>和 <b>EmptyUserIdInConstructor</b><b></b>执行时也会发生同样的情况。这样的方法可以用于向数据库中插入默认的数据，然后在测试完成时清除插入的数据。例如，我们可以做到在 <b>Initialize()</b><b></b>中开始一个事务，然后在清除时回滚同一个事务，这样一来，如果测试方法使用相同的连接时，数据状态会在每次测试执行完成时恢复原状。类似地，测试文件也可以这样处理。</p>
		<p>在调试期间，<b>TestCleanupAttribute</b><b></b>修饰的方法可能由于调试器在清除的代码执行前终止运行。由于这个原因，最好在设置测试期间检查清除情况，并在需要时在设置测试前执行清除代码。关于初始化和清除的其它可用的测试属性有 <b>AssemblyInitializeAttribute/AssemblyCleanupAttribute</b><b></b>和 <b>ClassInitializeAttribute/ClassCleanupAttribute</b>。程序集相关的属性对整个程序集运行一次，而类相关的属性对一个特定的测试类的加载运行一次。</p>
		<div style="MARGIN-TOP: 3px; MARGIN-BOTTOM: 10px">
				<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#top">
						<img height="9" alt="返回页首" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width="7" border="0" />
				</a>
				<a class="topOfPage" href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#top">返回页首</a>
		</div>
		<a name="EHHAE">
		</a>
		<h2>最佳实践</h2>
		<p>在结束前我们回顾几种单元测试的最佳实践。首先，TDD 是非常有价值的实践。在所有现有的开发方法中，TDD 可能是多年来根本上改进开发且投资成本最小的一种。每个 QA 工程师都会告诉您，开发人员在没有相应的测试前不会写出成功的软件。有了 TDD，实践是在实现前编写测试，并且理想情况是，编写的测试可以成为无需人工参与执行的构建脚本的一部分。需要训练来开始养成习惯，但一旦建立习惯后，不使用 TDD 方法编码就像开车时不系安全带一样。</p>
		<p>对于测试本身，有一些额外的原则可以帮助成功进行测试：</p>
		<table cellspacing="0" cellpadding="0" border="0">
				<tbody>
						<tr>
								<td class="listBullet" valign="top">•</td>
								<td class="listItem">
										<p>避免测试产生依赖性，这样测试需要按照特定的顺序执行。每个测试都应该是自治的。</p>
								</td>
						</tr>
						<tr>
								<td class="listBullet" valign="top">•</td>
								<td class="listItem">
										<p>使用测试初始化代码验证测试清除已经成功执行，如果没有则在执行测试前重新执行清除。 </p>
								</td>
						</tr>
						<tr>
								<td class="listBullet" valign="top">•</td>
								<td class="listItem">
										<p>在编写任何产品代码的实现前编写测试。 </p>
								</td>
						</tr>
						<tr>
								<td class="listBullet" valign="top">•</td>
								<td class="listItem">
										<p>对于产品代码中的每个类创建一个测试类。这样可以简化测试的组织，并可以容易地选择在何处放置每个测试。</p>
								</td>
						</tr>
						<tr>
								<td class="listBullet" valign="top">•</td>
								<td class="listItem">
										<p>使用 Visual Studio 生成初始化的测试项目。这样可以大大减少手工设置测试项目并与产品项目关联的步骤。 </p>
								</td>
						</tr>
						<tr>
								<td class="listBullet" valign="top">•</td>
								<td class="listItem">
										<p>避免创建其他依赖计算机的测试，例如依赖特定的目录路径的测试。</p>
								</td>
						</tr>
						<tr>
								<td class="listBullet" valign="top">•</td>
								<td class="listItem">
										<p>创建模拟对象 (mock object) 来测试接口。模拟对象通常在需要验证 API 符合所需功能的测试项目中实现。</p>
								</td>
						</tr>
						<tr>
								<td class="listBullet" valign="top">•</td>
								<td class="listItem">
										<p>在继续创建新的测试前验证所有测试运行成功。这样可以保证在破坏代码后立刻进行修正。</p>
								</td>
						</tr>
						<tr>
								<td class="listBullet" valign="top">•</td>
								<td class="listItem">
										<p>可以最大化无需人工参与执行的测试代码。在依赖于手工测试前，必须完全肯定无法采用合理的无需人工参与执行的测试方案。 </p>
								</td>
						</tr>
				</tbody>
		</table>
		<div style="MARGIN-TOP: 3px; MARGIN-BOTTOM: 10px">
				<a href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#top">
						<img height="9" alt="返回页首" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width="7" border="0" />
				</a>
				<a class="topOfPage" href="http://www.microsoft.com/china/msdn/library/langtool/vsts/vstsunittesting.mspx#top">返回页首</a>
		</div>
		<a name="EAIAE">
		</a>
		<h2>小结</h2>
		<p>总的来说，VSTS 的单元测试功能本身很好理解。而且尽管本文没有提到，它还可以通过自定义执行引擎进行扩展。此外，它包含了代码覆盖分析的功能，这对于评价测试的全面性非常有用。通过使用 VSTS，您可以将测试数目和 bug 数目或编写的代码数量进行关联比较。这为项目的运行状况提供了很好的指标。</p>
		<p>本文介绍了Team Test 产品中的基本单元测试功能，也探讨了关于数据驱动测试的一些更加高级的功能。通过开始实践对代码进行单元测试，您会为产品的整个生命期建立一套宝贵的测试集。Team Test 通过与 Visual Studio 的强大集成和其它 VSTS 产品线，使这一切变得容易。</p>
		<p>
				<b>Mark Michaelis</b> 在 Itron 公司担任软件架构师和讲师。他曾经对几个微软的产品设计进行检查，包括 C# 和VSTS。现在他正在撰写另外一本有关 C# 的书，Essential C# (Addison Wesley)。不使用计算机时，他会陪伴家人，进行户外运动，或者进行环球旅行。Mark Michaelis 住在 Spokane, WA。您可以通过 <a href="mailto:mark@michaelis.net"><em>mark@michaelis.net</em></a> 和他联系或者访问他的网络日志：<a href="http://mark.michaelis.net/" target="_blank">http://mark.michaelis.net</a>。</p>
		<p>
				<a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnvs05/html/vstsunittesting.asp" target="_blank">转到原英文页面</a>
		</p>
		<p>翻译者Luke是微软公司的软件工程师，习惯使用C++和C#开发应用程序。闲暇时间他喜欢音乐，旅游和怀旧游戏，并且愿意帮助MSDN翻译更多的文章和其他开发者共享。可以通过ecaijw@msn.com联系他。</p>
<img src ="http://www.cppblog.com/mzty/aggbug/8624.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2006-06-16 11:46 <a href="http://www.cppblog.com/mzty/archive/2006/06/16/8624.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Microsoft Visual Studio Team Edition for Software Developers</title><link>http://www.cppblog.com/mzty/archive/2006/06/16/8620.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Fri, 16 Jun 2006 01:44:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2006/06/16/8620.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/8620.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2006/06/16/8620.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/8620.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/8620.html</trackback:ping><description><![CDATA[
		<table id="Table1" style="WIDTH: 80%; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="0" name="Table1">
				<tbody>
						<tr id="Tablerow3" style="PADDING-RIGHT: 15px; WIDTH: 100%" valign="top" align="right" name="Tablerow3">
								<td id="Tablecell3" style="TEXT-ALIGN: left" valign="top" name="Tablecell3">
										<img id="PullImage" alt="See this in the MSDN Library" src="http://msdn.microsoft.com/msdn-online/shared/graphics/library.gif" align="left" border="0" />
										<span id="PullLabel">
												<a href="http://msdn.microsoft.com/library/en-us/dnvs05/html/VS2005TeamDev.asp">See This in the MSDN Library</a>
										</span>
								</td>
						</tr>
				</tbody>
		</table>
		<div id="nsbanner">
				<div id="TitleRow">
						<h1 class="dtH1">
								<a name="vs2005teamdev">
								</a>Microsoft Visual Studio Team Edition for Software Developers</h1>
						<h4 class="dtH1">A new standard in developer productivity</h4>
				</div>
		</div>
		<div id="nstext" valign="bottom">  
<p>Eric Lee<br />Microsoft Corporation</p><p>January 2005</p><p><b>Summary</b>: Describes the features available in Microsoft Visual Studio Team Edition for Software Developers for improving code quality. (18 printed pages)</p><blockquote class="dtBlock"><b class="le">Note </b>This content originally appeared in the January 2005 edition of <i>.NET Developer's Journal</i>. It is reproduced here with permission of the publisher.</blockquote><p>In 1991, Microsoft released Visual Basic 1.0 and ushered in a new era of developer productivity. Building graphical user interfaces for Windows applications (which was once the domain of a select few) became instantly accessible to a broad range of developers. Over time, Visual Basic was joined by Visual C++, Visual C#, and Visual J# to form the Visual Studio suite. Although the development challenges have changed (from building desktop applications to building applications for the Internet), Visual Studio has remained true to its birthright of maximizing developer productivity. </p><p>Today, it is increasingly common, and crucial, to measure developer productivity at the team level, rather than merely at the individual level. Building software for today's global market requires a variety of disciplines working together in teams. </p><p>The introduction of Visual Studio Team System extends the promise of productivity, which was introduced in 1991, from the individual developer to these multidiscipline teams. Visual Studio Team System was designed from the ground up to recognize both the needs of the unique disciplines involved in software development today, as well as the need for these unique disciplines to work together. Figure 1 illustrates the various components that make up Visual Studio Team System. </p><p class="fig"><img alt="" src="http://msdn.microsoft.com/library/en-us/dnvs05/html/vs2005teamdev01.gif" border="0" /></p><p class="label"><b>Figure 1. Visual Studio Team System</b></p><p>Visual Studio Team System targets individual disciplines with editions targeted at Architects, Developers, and Testers. Each uses the traditional Visual Studio 2005 as its base. From that base, each edition adds features that reflect their namesake disciplines as well as features to reflect how these disciplines work together. </p><p>Tying these disciplines together is Team Foundation Server. Team Foundation Server provides the source-code control, work item tracking, data warehousing, and reporting that allows developers, architects, testers, and project managers to work together efficiently. </p><p>The discipline-focused Team editions and Team Foundation Server together form a comprehensive suite of technology. To help understand the best way to use this technology, Process Architecture and Guidance (PAG) content was created to illustrate how Visual Studio Team System can be used to address real-world problems. </p><p>Finally, Visual Studio Team System recognizes the importance of being a platform on which partners can build their own technology. Visual Studio Industry Partners (VSIP) has long been a part of traditional Visual Studio offers. Visual Studio Team System continues this tradition; there will be a wide range of extensibility points available in Visual Studio Team System. </p><p>This article primarily focuses on Microsoft Visual Studio Team Edition for Software Developers features. However, as we examine each feature, we will take the opportunity to explore other features that are available in Team System. </p><h2 class="dtH1">Working at AdventureWorks</h2><p>As an example, suppose that we are developers working in a fictional company called "AdventureWorks." Our company sells outdoor sporting goods through its Web site, as shown in Figure 2. Our job is to implement a new feature that will allow our customers to pick up items they have purchased at a physical store, rather than having the items shipped to them. </p><p class="fig"><img alt="" src="http://msdn.microsoft.com/library/en-us/dnvs05/html/vs2005teamdev02.gif" border="0" /></p><p class="label"><b>Figure 2: AdventureWorks Web site</b></p><h2 class="dtH1">Working on a Team</h2><p>Deciding on what code to write and communicating that choice to your team can sometimes be a clumsy affair with today's programming environments. Typically, software development teams use their own work item tracking tools; testers and project managers just do the best they can to track the progress of these work items. </p><p>The integration of Visual Studio Team Edition for Software Developers with Team Foundation Server is intended to make this workflow more natural, and therefore more productive. Work items are stored in Team Foundation Server and are accessible from a number of clients, including Visual Studio Team Edition for Software Developers. Our project managers have created a schedule and a list of work items, using Microsoft Project and Microsoft Excel, to track this new feature. </p><p>These tools are not traditional development tools. However, Visual Studio Team System was designed from the beginning to recognize the different disciplines that are part of software development, as well as the different tools that these disciplines use. </p><p>Visual Studio Team System will ship with plug-ins to Microsoft Excel and Microsoft Project that allow these tools to use Team Foundation Server to create, modify, or delete work items. Figure 3 illustrates how you can use Microsoft Excel to import work items that are actually stored in Team Foundation Server. The extensions to Excel and Project were built using Visual Studio Team System's extensibility framework. </p><p class="fig"><img alt="" src="http://msdn.microsoft.com/library/en-us/dnvs05/html/vs2005teamdev03.gif" border="0" /></p><p class="label"><b>Figure 3. Importing work items into Microsoft Excel</b></p><p>With the schedule and work items in hand, we can start our development work. Figure 4 shows how we would use Visual Studio Team Edition for Software Developers to view the work items that were assigned to us. </p><p class="fig"><img alt="" src="http://msdn.microsoft.com/library/en-us/dnvs05/html/vs2005teamdev04.gif" border="0" /></p><p class="label"><b>Figure 4. Viewing work items in Visual Studio</b></p><p>As we work (i.e., resolving work items, fixing bugs, etc.) and change the status of these work items, our project managers can refresh their spreadsheets and project plans to get an instant status update whenever they want to. Within Visual Studio Team Edition for Software Developers, we can choose whether we want to be notified when our work items in Team Foundation Server change. Figure 5 shows how we can make these choices. As we work, we can rest assured that if any of our work items change, we will be notified instantly. </p><p class="fig"><img alt="" src="http://msdn.microsoft.com/library/en-us/dnvs05/html/vs2005teamdev05.gif" border="0" /></p><p class="label"><b>Figure 5. Changing the status of work items</b></p><h2 class="dtH1">Writing Code: A Test-Driven Approach</h2><p>Visual Studio Team System allows you to follow any number of development practices. One practice that's gaining momentum is test-driven development. This revolves around the idea of writing tests first, followed by your actual feature code. This novel approach has proved to be very effective in practice. </p><p>Visual Studio Team System is very well suited for test-driven development, so we will use it as an example. However, the scope of this article won't allow for the in-depth discussion that test-driven development deserves; a much more detailed explanation of this development practice can be found at http://msdn.microsoft.com/msdnmag/issues/04/04/ExtremeProgramming/. </p><p>Our first work item calls for us to implement in-store pickup. Because we are using a test-driven development approach, our first step will be to write the code that will test this feature, rather than the feature itself. </p><p>One of the benefits of starting with the test is that you can define the most intuitive interface for your feature first. This can occur without being influenced by how that feature may have been implemented. In our case, we will choose to expose our new functionality through a function in our business logic called DoInStorePickup. </p><p>Our first unit test (see Figure 6) is C# code. The code is decorated with attributes. These attributes are used to identify what methods in a given class represent a test and how that test should be executed. </p><p class="fig"><img alt="" src="http://msdn.microsoft.com/library/en-us/dnvs05/html/vs2005teamdev06.gif" border="0" /></p><p class="label"><b>Figure 6. C# code, with test attributes</b></p><p>If we were to build at this point, our test would not compile because we have not implemented the DoInStorePickup method. This is intentional. Following test-driven development, our next step is to write just enough code to make our test compile. </p><p>We can easily do this by using the refactoring features in Visual Studio 2005 to generate a stub for our new method. Visual Studio 2005 allows you to choose an arbitrary piece of source code and refactor it into various things such as methods or classes. In Figure 7 we will use this feature to generate a method stub for DoInStorePickup. </p><p class="fig"><img alt="" src="http://msdn.microsoft.com/library/en-us/dnvs05/html/vs2005teamdev07.gif" border="0" /></p><p class="label"><b>Figure 7. Generating a Stub method</b></p><p>After creating a stub for DoInStorePickup, we can build and run our test from within Visual Studio Team Edition for Software Developers. Figure 8 illustrates the simple, easy-to-use user interface part for organizing, executing, and monitoring the process of our unit tests. More extensive organizational features are available with Visual Studio Team Edition for Software Testers.</p><p class="fig"><img alt="" src="http://msdn.microsoft.com/library/en-us/dnvs05/html/vs2005teamdev08.gif" border="0" /></p><p class="label"><b>Figure 8. Organizing unit tests</b></p><p>As you can see in Figure 8, the first attempt at running our test has failed. This is another intentional aspect of test-driven development. Our next step is to add just enough functionality to InStorePickup to allow our test to pass. </p><p>By using this iterative process of writing a test and then writing just enough functionality to allow it to pass, we can build toward more complicated functionality. The final product of our test-driven efforts will be a fully implemented feature with a full suite of unit tests that will catch possible regressions in the future. As an example, we will fast forward through this process and finish off our method. Figure 9 shows the complete code for our DoInStorePickup method. </p><p class="fig"><img alt="" src="http://msdn.microsoft.com/library/en-us/dnvs05/html/vs2005teamdev09.gif" border="0" /></p><p class="label"><b>Figure 9. Complete DoInStorePickup method</b></p><p>One benefit of test-driven development is that the tests usually execute a high percentage of our feature code. One of the many attributes that we can configure as part of a unit test run is one that automatically collects code coverage data. Figure 10 shows how we can select which artifacts (i.e., Visual Studio projects and binaries) we want to collect code coverage for. </p><p class="fig"><img alt="" src="http://msdn.microsoft.com/library/en-us/dnvs05/html/vs2005teamdev10.gif" border="0" /></p><p class="label"><b>Figure 10. Selecting artifacts for code coverage</b></p><p>Code coverage results are organized in a hierarchical manner by namespace, class, and method. Code coverage data in this form is well suited for merging between runs or publishing as part of a larger report. Figure 11 illustrates how code coverage results are just another aspect of test results. </p><p class="fig"><img alt="" src="http://msdn.microsoft.com/library/en-us/dnvs05/html/vs2005teamdev11.gif" border="0" /></p><p class="label"><b>Figure 11. Code coverage results</b></p><p>For day-to-day development or whenever more immediate feedback is needed, Visual Studio Team Edition for Software Developers can report code coverage in its natural environment: source code. Figure 12 shows how code coverage results are associated with your source code. </p><p class="fig"><img alt="" src="http://msdn.microsoft.com/library/en-us/dnvs05/html/vs2005teamdev12.gif" border="0" /></p><p class="label"><b>Figure 12. Code coverage with code</b></p><p>Lines that were executed are shown in green, uncovered lines are shown in red, and partially covered lines are shown in blue. Lines of code that are branches or loops are most often partially covered. In our example, we can see that we missed an entire method. Unit testing is also available in its natural environment. In the code editor, we can choose what we want to test and automatically create a unit test. Figure 13 shows how this functionality is integrated into Visual Studio's code editor. The resulting unit test is very similar to the one we just hand-coded. Generating unit tests automatically can be very useful if you already have an existing code base to generate a suite of unit tests. </p><p class="fig"><img alt="" src="http://msdn.microsoft.com/library/en-us/dnvs05/html/vs2005teamdev13.gif" border="0" /></p><p class="label"><b>Figure 13. Automatically generating unit tests</b></p><h2 class="dtH1">Saving Our Work: Using Source-Code Control</h2><p>With our in-store pickup feature written, the next logical step would be to check-in our changes. Visual Studio Team System introduces a completely new, enterprise-level source-code control system that is an integral part of Team Foundation Server. Figure 14 shows one aspect of this new system: the pending check-ins dialog box. </p><p>Aside from seeing what files need to be checked-in, with this dialog box you can query to find work items to associate with this check-in. Work items associated in this manner are automatically checked-in. The check-in notes page on this dialog box is a customizable interface that your organization can use to gather information pertinent to a given check-in. </p><p class="fig"><img alt="" src="http://msdn.microsoft.com/library/en-us/dnvs05/html/vs2005teamdev14.gif" border="0" /></p><p class="label"><b>Figure 14. Pending check-ins</b></p><p>The last aspect of this dialog allows us to introduce another feature in Visual Studio Team Edition for Software Developers. Team Foundation Server allows you configure and optionally create policies that are enforced with each check-in. One of the policies you can enable specifies static code analysis should be run before each check-in. </p><h2 class="dtH1">Automatic Code Reviews</h2><p>Static code analysis is essentially an automated code review; it is available in Visual Studio Team Edition for Software Developers for both .NET and C/C++ source code. For .NET, the analysis is done based on a set of configurable warnings (see Figure 15). These warnings identify known issues involving security, performance, design, and general quality. Continuing with the theme of extensibility in Visual Studio Team System, you can write your own plug-ins and use them with managed code analysis.</p><p class="fig"><img alt="" src="http://msdn.microsoft.com/library/en-us/dnvs05/html/vs2005teamdev15.gif" border="0" /></p><p class="label"><b>Figure 15. Configurable warnings</b></p><p>When we run code analysis on our example, we see that several issues are identified in our source code. Code analysis warnings are shown in Visual Studio's task list so they should be familiar to any developer. Code analysis for C/C++ is specially tuned to identify potential security vulnerabilities such as buffer overruns. The exact code paths to these types of errors (which are not as common in .NET code) are highlighted directly in Visual Studio's code editor. Figure 16 shows the path of execution that is vulnerable to a buffer-overflow. </p><p class="fig"><img alt="" src="http://msdn.microsoft.com/library/en-us/dnvs05/html/vs2005teamdev16.gif" border="0" /></p><p class="label"><b>Figure 16. Vulnerable code</b></p><p>For some warnings, we may want to do some more in-depth investigation. We can use Team Foundation Server to file bugs directly against these warnings. Figure 17 shows an example of how we can create a bug based on a code analysis warning.</p><p class="fig"><img alt="" src="http://msdn.microsoft.com/library/en-us/dnvs05/html/vs2005teamdev17.gif" border="0" /></p><p class="label"><b>Figure 17. Creating a bug based on code analysis</b></p><p>Once we correct these warnings, we will be able to check our changes into Team Foundation Server. Code analysis gives us confidence that our source code has passed a rigorous analysis against known issues. </p><p>Before we call it a day, our last step will be to investigate the performance characteristics of the code we just wrote. There are a number of ways to start a performance investigation; for this article, we will go back to our unit test. Based on our code coverage results, we know our unit test does a good job of exercising our source code. Now, let's use that unit test to drive our performance investigation. </p><p>We can create a Performance Session directly from the result of our unit test. Figure 18 shows an example of how this is done. </p><p class="fig"><img alt="" src="http://msdn.microsoft.com/library/en-us/dnvs05/html/vs2005teamdev18.gif" border="0" /></p><p class="label"><b>Figure 18. Creating a performance session</b></p><h2 class="dtH1">Writing Efficient Code</h2><p>The Visual Studio Team Edition for Software Developers Performance Tools trace their technological roots back almost a decade to the labs of Microsoft Research. At that time, Microsoft Research was responsible for a set of performance tools that was created to help optimize products such as Windows Server 2003 and SQL Server. From these efforts came technology that would eventually find its way into Visual Studio Team Edition for Software Developers—albeit in a much more refined, enterprise-friendly form. Visual Studio Team Edition for Software Developers allows us to gather performance data at a number of levels. We can use a method of profiling called sampling to get a very high-level view of the potential hotspots in our application. From there, we can use Visual Studio Team Edition for Software Developers to insert timing probes into our application; this process is called instrumentation. This method of profiling allows us to gather very detailed performance data about specific areas in our application. For .NET applications, we can gather data about how our application is using memory. This is often a key factor in how an application performs. </p><p>Visual Studio Team Edition for Software Developers hides all of the complexity of configuring an application for profiling behind a wizard (see Figure 19). We can choose to profile .NET, ASP.NET, or C/C++ applications, and Visual Studio Team Edition for Software Developers will ensure that our application is properly configured for profiling. </p><p class="fig"><img alt="" src="http://msdn.microsoft.com/library/en-us/dnvs05/html/vs2005teamdev19.gif" border="0" /></p><p class="label"><b>Figure 19. Configuring an application for profiling</b></p><p>Once Visual Studio Team Edition for Software Developers has gathered data about our application, we generate a performance report based on this data. This report can be viewed in a number of different ways depending on whether you want to see how functions call each other, a sequence of events, or a list of all function called by your applications. </p><p>It's very easy to gather a lot of performance data for an application. To help cope with this data, you can generate a summary that highlights key areas where you might choose to start your investigation. </p><p>For example, a histogram can be rendered to show your .NET application is using garbage collection. A suspicious pattern in this histogram would lead you to the Allocations view shown in Figure 20. This view shows all of the .NET types that were allocated by your application, and the functions that did the allocation. This view allows you to quickly spot any objects that might be causing problematic garbage collection patterns. </p><p class="fig"><img alt="" src="http://msdn.microsoft.com/library/en-us/dnvs05/html/vs2005teamdev20.gif" border="0" /></p><p class="label"><b>Figure 20. Allocations view</b></p><h2 class="dtH1">Communicating Status</h2><p>Once we have fixed any possible performance issues or entered work items for them in Team Foundation Server, we're ready to check-in our work. We can associate our check-in with the work items that started us off. </p><p>These work items will be automatically resolved and the project managers at AdventureWorks who created them can easily see the progress we've made in their Excel spreadsheets or Project plans. Figure 21 shows all of our initial work items completed. </p><p class="fig"><img alt="" src="http://msdn.microsoft.com/library/en-us/dnvs05/html/vs2005teamdev21.gif" border="0" /></p><p class="label"><b>Figure 21. Initial work items completed</b></p><h2 class="dtH1">Conclusion</h2><p>Visual Studio Team Edition for Software Developers takes the best of Visual Studio 2005 (programming languages, debuggers, libraries, etc.), and extends it with features targeted toward developers working on a team. The goal of Visual Studio Team Edition for Software Developers, and Team System as a whole, is to take the vision of productivity that created Visual Studio in the first place and extend it to the enterprise. We found that the challenge to realizing this vision is not just in how developers, testers, project managers, and architects worked on their own, but it is also in how they work together. Every aspect of Visual Studio Team System 2005 was carefully designed and scrutinized to ensure that they work together seamlessly. From this crucible comes a product, like its distant cousin, Visual Basic 1.0, that will usher in a new standard of developer productivity. </p><p></p><p> </p><hr noshade="" size="1" /><b>About the author</b><p>Eric Lee graduated from the University of Windsor Ontario in 1998 and joined Microsoft shortly afterwards. He has spent his career at Microsoft as a tester, developer, and now product manager for the Developer Tools division. Eric previously held positions on the Windows Server 2003 team, where he contributed to Enterprise UDDI Services.</p></div>
<img src ="http://www.cppblog.com/mzty/aggbug/8620.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2006-06-16 09:44 <a href="http://www.cppblog.com/mzty/archive/2006/06/16/8620.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>