<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>解惑 &#187; .net</title>
	<atom:link href="http://www.jiehoo.me/category/net/feed" rel="self" type="application/rss+xml" />
	<link>http://www.jiehoo.me</link>
	<description>解己之惑，解人之惑</description>
	<lastBuildDate>Mon, 19 Jul 2010 10:01:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>反射获取集合中指定下标的元素</title>
		<link>http://www.jiehoo.me/%e5%8f%8d%e5%b0%84%e8%8e%b7%e5%8f%96%e9%9b%86%e5%90%88%e4%b8%ad%e6%8c%87%e5%ae%9a%e4%b8%8b%e6%a0%87%e7%9a%84%e5%85%83%e7%b4%a0.htm</link>
		<comments>http://www.jiehoo.me/%e5%8f%8d%e5%b0%84%e8%8e%b7%e5%8f%96%e9%9b%86%e5%90%88%e4%b8%ad%e6%8c%87%e5%ae%9a%e4%b8%8b%e6%a0%87%e7%9a%84%e5%85%83%e7%b4%a0.htm#comments</comments>
		<pubDate>Wed, 30 Jun 2010 08:10:41 +0000</pubDate>
		<dc:creator>Cherami</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[反射]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[集合]]></category>

		<guid isPermaLink="false">http://www.jiehoo.me/?p=1033</guid>
		<description><![CDATA[不废话了，直接上代码吧： public static object GetElementFromCollection(object obj, int index) { Type type = obj.GetType(); if (type.IsArray) { return ((Array) obj).GetValue(index); } else { object[] attributes = type.GetCustomAttributes(typeof(DefaultMemberAttribute), true); DefaultMemberAttribute attribute = (DefaultMemberAttribute) attributes[0]; String indexerName = attribute.MemberName; type.GetProperties(); PropertyInfo pi2 = type.GetProperty(indexerName, new Type[] { typeof(int) }); return pi2.GetValue(obj, new Object[] {index}); } }]]></description>
			<content:encoded><![CDATA[<p class='fp'>不废话了，直接上代码吧：</p>
<p>public static object GetElementFromCollection(object obj, int index)<br />
{<br />
Type type = obj.GetType();<br />
if (type.IsArray)<br />
{<br />
return ((Array) obj).GetValue(index);<br />
}<br />
else<br />
{<br />
object[] attributes = type.GetCustomAttributes(typeof(DefaultMemberAttribute), true);<br />
DefaultMemberAttribute attribute = (DefaultMemberAttribute) attributes[0];<br />
String indexerName = attribute.MemberName;<br />
type.GetProperties();<br />
PropertyInfo pi2 = type.GetProperty(indexerName, new Type[] { typeof(int) });<br />
return pi2.GetValue(obj, new Object[] {index});<br />
}<br />
}</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jiehoo.me/%e5%8f%8d%e5%b0%84%e8%8e%b7%e5%8f%96%e9%9b%86%e5%90%88%e4%b8%ad%e6%8c%87%e5%ae%9a%e4%b8%8b%e6%a0%87%e7%9a%84%e5%85%83%e7%b4%a0.htm/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>用C#动态调用WebService</title>
		<link>http://www.jiehoo.me/%e7%94%a8c%e5%8a%a8%e6%80%81%e8%b0%83%e7%94%a8webservice.htm</link>
		<comments>http://www.jiehoo.me/%e7%94%a8c%e5%8a%a8%e6%80%81%e8%b0%83%e7%94%a8webservice.htm#comments</comments>
		<pubDate>Wed, 30 Jun 2010 08:08:09 +0000</pubDate>
		<dc:creator>Cherami</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[动态]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[认证]]></category>
		<category><![CDATA[WebService]]></category>

		<guid isPermaLink="false">http://www.jiehoo.me/?p=1027</guid>
		<description><![CDATA[其实利用的都是前人的成果：C# – Dynamically Invoke Web Service At Runtime 这个文章的问题是没有提及需要认证的时候怎么办，但是后面很多回帖都问到了，总结下： 在读取WSDL的时候有几种方式，我使用的是： WebClient client = new WebClient(); if (_needCredential) { client.Credentials = _credential; } Stream stream = client.OpenRead(WSDL); XmlTextReader xmlreader = new XmlTextReader(stream); //XmlTextReader xmlreader = new XmlTextReader(Uri); ServiceDescriptionImporter descriptionImporter = BuildServiceDescriptionImporter(xmlreader); Assembly library = CompileAssembly(descriptionImporter); 在真正生成WebService的Instance以后，需要设置Instance的几个Property： if (_needCredential) { PropertyInfo preAuthenticate = GetRealType().GetProperty(&#8220;PreAuthenticate&#8221;); preAuthenticate.SetValue(Result, true, null); [...]]]></description>
			<content:encoded><![CDATA[<p class='fp'>其实利用的都是前人的成果：<a title="C# – Dynamically Invoke Web Service At Runtime" href="http://www.crowsprogramming.com/archives/66" target="_blank">C# – Dynamically Invoke Web Service At Runtime</a></p>
<p>这个文章的问题是没有提及需要认证的时候怎么办，但是后面很多回帖都问到了，总结下：</p>
<p>在读取WSDL的时候有几种方式，我使用的是：</p>
<p>WebClient client = new WebClient();</p>
<p>if (_needCredential)<br />
{<br />
client.Credentials = _credential;<br />
}<br />
Stream stream = client.OpenRead(WSDL);<br />
XmlTextReader xmlreader = new XmlTextReader(stream);</p>
<p>//XmlTextReader xmlreader = new XmlTextReader(Uri);<br />
ServiceDescriptionImporter descriptionImporter = BuildServiceDescriptionImporter(xmlreader);<br />
Assembly library = CompileAssembly(descriptionImporter);</p>
<p>在真正生成WebService的Instance以后，需要设置Instance的几个Property：</p>
<p>if (_needCredential)<br />
{<br />
PropertyInfo preAuthenticate = GetRealType().GetProperty(&#8220;PreAuthenticate&#8221;);<br />
preAuthenticate.SetValue(Result, true, null);<br />
PropertyInfo url = GetRealType().GetProperty(&#8220;Url&#8221;);<br />
url.SetValue(Result, Url, null);<br />
CredentialCache cache = new CredentialCache();<br />
Uri uri = new Uri(Url);<br />
cache.Add(uri, &#8220;Basic&#8221;, _credential);<br />
PropertyInfo credentials = GetRealType().GetProperty(&#8220;Credentials&#8221;);<br />
credentials.SetValue(Result, cache, null);<br />
}</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jiehoo.me/%e7%94%a8c%e5%8a%a8%e6%80%81%e8%b0%83%e7%94%a8webservice.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>测试框架</title>
		<link>http://www.jiehoo.me/%e6%b5%8b%e8%af%95%e6%a1%86%e6%9e%b6.htm</link>
		<comments>http://www.jiehoo.me/%e6%b5%8b%e8%af%95%e6%a1%86%e6%9e%b6.htm#comments</comments>
		<pubDate>Wed, 30 Jun 2010 07:59:28 +0000</pubDate>
		<dc:creator>Cherami</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[框架]]></category>
		<category><![CDATA[测试]]></category>

		<guid isPermaLink="false">http://www.jiehoo.me/?p=1029</guid>
		<description><![CDATA[最近在做C#版的测试框架，目的其实是让QA不用写代码就可以测试API，QA需要写一些XML，然后交给这个测试框架运行。 设计其实比较直接，把功能测试中的一些概念抽取出来包装下就可以了，XML要人可读可写，然后能够直接转换为对应的类，免去解析的过程最好。 我提取出来的主要概念如下： Library，对应的其实就是DLL，就像java中的jar一样，可以从指定的路径load，也可以从系统的GAC（windows特定的东西）里面load。 Instance，其实本来想叫Object，因为是关键字，只能取这个比较紧似的名字，另外，声明的也确实是对象的instance而不是对象定义。 List，集合类型，可以当成List或者Array用。 WebService，这个是Instance的子类可能有点怪，但是框架的工作机制是生成WebService的Stub的对应的类，所以其实也是Instance，只是有一些额外的属性。 Operation，其实就是操作了，有很多子类型： Method，就是方法调用了 Verify，主要是为了做结果验证，其实也是Method，只不过掩盖了实现，我用的就是NUit的实现。 Task，Operation的集合，本来想加一个Function的，但是感觉Function和Task功能完全一样。Task就相当于功能测试或者单元测试的一个方法。 Express，表达式，主要是为了支持简单的字符串连接和数学运算。 Field，获取或者设置Instance的field，我掩盖了C#中的Property和Field的区别，只提供Field，两种都可以访问。 Loop，其实也是Operation的集合，但是会把集合中的Operation重复执行很多次，用于性能测试或者批量调用，会生成一个索引值供Operation引用生成不同的值。 Indexer，访问集合类型中的某个指定下标的元素，主要是因为C#没有像Java一样提供Get(int index)方法，否则这个完全没有，直接用Method 就可以实现了。 Finder，主要是简化了从集合类型中查找某个元素，框架没有提供if/else这样的逻辑控制，只能提供这个变向的方式。 Wait，主要是提供Sleep以及异步调用支持，是Verify的子类型，可以每隔一段时间Verify一下，看看结果是不是match，然后有超时，超时就认为Veirfy失败。 Define，就是组件声明，里面包含的就是上面提到的那些东西。 Suite，就是Test Case了，包含Define列表和Task列表，以及Startup/Teardown 基本上已经涵盖测试中需要的大部分内容了。 一些额外的想法，Operation还是有很大扩展余地的，例如可以支持外部调用，例如调用一个命令行或者其它的程序。]]></description>
			<content:encoded><![CDATA[<p class='fp'>最近在做C#版的测试框架，目的其实是让QA不用写代码就可以测试API，QA需要写一些XML，然后交给这个测试框架运行。</p>
<p>设计其实比较直接，把功能测试中的一些概念抽取出来包装下就可以了，XML要人可读可写，然后能够直接转换为对应的类，免去解析的过程最好。</p>
<p>我提取出来的主要概念如下：</p>
<ul>
<li>Library，对应的其实就是DLL，就像java中的jar一样，可以从指定的路径load，也可以从系统的GAC（windows特定的东西）里面load。</li>
<li>Instance，其实本来想叫Object，因为是关键字，只能取这个比较紧似的名字，另外，声明的也确实是对象的instance而不是对象定义。
<ul>
<li>List，集合类型，可以当成List或者Array用。</li>
<li>WebService，这个是Instance的子类可能有点怪，但是框架的工作机制是生成WebService的Stub的对应的类，所以其实也是Instance，只是有一些额外的属性。</li>
</ul>
</li>
<li>Operation，其实就是操作了，有很多子类型：
<ul>
<li>Method，就是方法调用了</li>
<li>Verify，主要是为了做结果验证，其实也是Method，只不过掩盖了实现，我用的就是NUit的实现。</li>
<li>Task，Operation的集合，本来想加一个Function的，但是感觉Function和Task功能完全一样。Task就相当于功能测试或者单元测试的一个方法。</li>
<li>Express，表达式，主要是为了支持简单的字符串连接和数学运算。</li>
<li>Field，获取或者设置Instance的field，我掩盖了C#中的Property和Field的区别，只提供Field，两种都可以访问。</li>
<li>Loop，其实也是Operation的集合，但是会把集合中的Operation重复执行很多次，用于性能测试或者批量调用，会生成一个索引值供Operation引用生成不同的值。</li>
<li>Indexer，访问集合类型中的某个指定下标的元素，主要是因为C#没有像Java一样提供Get(int index)方法，否则这个完全没有，直接用Method 就可以实现了。</li>
<li>Finder，主要是简化了从集合类型中查找某个元素，框架没有提供if/else这样的逻辑控制，只能提供这个变向的方式。</li>
<li>Wait，主要是提供Sleep以及异步调用支持，是Verify的子类型，可以每隔一段时间Verify一下，看看结果是不是match，然后有超时，超时就认为Veirfy失败。</li>
</ul>
</li>
<li>Define，就是组件声明，里面包含的就是上面提到的那些东西。</li>
<li>Suite，就是Test Case了，包含Define列表和Task列表，以及Startup/Teardown</li>
</ul>
<p>基本上已经涵盖测试中需要的大部分内容了。</p>
<p>一些额外的想法，Operation还是有很大扩展余地的，例如可以支持外部调用，例如调用一个命令行或者其它的程序。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jiehoo.me/%e6%b5%8b%e8%af%95%e6%a1%86%e6%9e%b6.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>反射创建一个指定类型的List</title>
		<link>http://www.jiehoo.me/%e5%8f%8d%e5%b0%84%e5%88%9b%e5%bb%ba%e4%b8%80%e4%b8%aa%e6%8c%87%e5%ae%9a%e7%b1%bb%e5%9e%8b%e7%9a%84list.htm</link>
		<comments>http://www.jiehoo.me/%e5%8f%8d%e5%b0%84%e5%88%9b%e5%bb%ba%e4%b8%80%e4%b8%aa%e6%8c%87%e5%ae%9a%e7%b1%bb%e5%9e%8b%e7%9a%84list.htm#comments</comments>
		<pubDate>Mon, 21 Jun 2010 07:01:00 +0000</pubDate>
		<dc:creator>Cherami</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[反射]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[List]]></category>

		<guid isPermaLink="false">http://www.jiehoo.me/?p=1016</guid>
		<description><![CDATA[由于最近在做C#版的测试框架，所以对C#的反射研究得比较多一点，这里是另外一个心得，由于运行时才知道类型，所以如何创建一个指定类型的List？其实很简单： Type elementType = realType; Type listType = typeof(List&#60;&#62;); Type typedListType = listType.MakeGenericType(elementType);]]></description>
			<content:encoded><![CDATA[<p class='fp'>由于最近在做C#版的测试框架，所以对C#的反射研究得比较多一点，这里是另外一个心得，由于运行时才知道类型，所以如何创建一个指定类型的List？其实很简单：</p>
<p>Type elementType = realType;<br />
Type listType = typeof(List&lt;&gt;);<br />
Type typedListType = listType.MakeGenericType(elementType);</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jiehoo.me/%e5%8f%8d%e5%b0%84%e5%88%9b%e5%bb%ba%e4%b8%80%e4%b8%aa%e6%8c%87%e5%ae%9a%e7%b1%bb%e5%9e%8b%e7%9a%84list.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使用批处理删除一个月以前的文件</title>
		<link>http://www.jiehoo.me/%e4%bd%bf%e7%94%a8%e6%89%b9%e5%a4%84%e7%90%86%e5%88%a0%e9%99%a4%e4%b8%80%e4%b8%aa%e6%9c%88%e4%bb%a5%e5%89%8d%e7%9a%84%e6%96%87%e4%bb%b6.htm</link>
		<comments>http://www.jiehoo.me/%e4%bd%bf%e7%94%a8%e6%89%b9%e5%a4%84%e7%90%86%e5%88%a0%e9%99%a4%e4%b8%80%e4%b8%aa%e6%9c%88%e4%bb%a5%e5%89%8d%e7%9a%84%e6%96%87%e4%bb%b6.htm#comments</comments>
		<pubDate>Tue, 13 Apr 2010 04:47:50 +0000</pubDate>
		<dc:creator>Cherami</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[定期]]></category>
		<category><![CDATA[BAT]]></category>
		<category><![CDATA[DOS]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://www.jiehoo.me/?p=1010</guid>
		<description><![CDATA[这个其实是上一篇文件备份的延续，既然备份了，备份越来越大当然不行，一般保留一个月的备份就足够了，DOS的功能也基本上能够满足这个要求，不废话，直接给脚本了： set year=%date:~10,4% set month=%date:~4,2% set day=%date:~7,2% set monthprefix=%month:~0,1% set /a oldmonth=%month%-1 if %oldmonth% EQU 0 goto _lastYear if %monthprefix% EQU 0 goto _onebitmonth :_lastYear set /a year=%year%-1 set deldate=%year%-12-%day% goto _execute :_onebitmonth set oldmonth=0%oldmonth% set deldate=%year%-%oldmonth%-%day% goto _execute :_execute for /f %%d in (&#8216;dir /b /d&#8217;) do if %%d LSS %deldate% rmdir /s /q [...]]]></description>
			<content:encoded><![CDATA[<p class='fp'>这个其实是上一篇<a href="http://www.jiehoo.me/windows%e4%b8%8b%e7%9a%84%e6%96%87%e4%bb%b6%e5%ae%9a%e6%9c%9f%e5%a4%87%e4%bb%bd.htm" target="_self">文件备份</a>的延续，既然备份了，备份越来越大当然不行，一般保留一个月的备份就足够了，DOS的功能也基本上能够满足这个要求，不废话，直接给脚本了：</p>
<p>set year=%date:~10,4%<br />
set month=%date:~4,2%<br />
set day=%date:~7,2%<br />
set monthprefix=%month:~0,1%<br />
set /a oldmonth=%month%-1<br />
if %oldmonth% EQU 0 goto _lastYear<br />
if %monthprefix% EQU 0 goto _onebitmonth</p>
<p>:_lastYear<br />
set /a year=%year%-1<br />
set deldate=%year%-12-%day%<br />
goto _execute</p>
<p>:_onebitmonth<br />
set oldmonth=0%oldmonth%<br />
set deldate=%year%-%oldmonth%-%day%<br />
goto _execute</p>
<p>:_execute<br />
for /f %%d in (&#8216;dir /b /d&#8217;) do if %%d LSS %deldate% rmdir /s /q %%d</p>
<p>应该看得懂吧。最后一行要留意下，定义变量的时候用了两个%号，这个是必须的。另外就是日期问题，不用关注闰年问题，因为是进行的字符串比较，日期（例如2010-02-29）即使不是合法日期也是没有关系的。另外就是日期的格式，因为是上一篇的延续，所以当然针对的是上一篇的日期格式了。</p>
<p>更新：</p>
<p>又搜索 了下，如果根据目录自己的创建时间来操作，有更简单的方法：</p>
<p>forfiles /p . /m * /d -30 /c &#8220;cmd /c rmdir /s /q @path&#8221;</p>
<p>如果是遍历所有的子目录删除文件，也很简单：</p>
<p>forfiles /p . /m *.* /d -30 /c &#8220;cmd /c del @path&#8221;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jiehoo.me/%e4%bd%bf%e7%94%a8%e6%89%b9%e5%a4%84%e7%90%86%e5%88%a0%e9%99%a4%e4%b8%80%e4%b8%aa%e6%9c%88%e4%bb%a5%e5%89%8d%e7%9a%84%e6%96%87%e4%bb%b6.htm/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>c#反射之Enum篇</title>
		<link>http://www.jiehoo.me/c%e5%8f%8d%e5%b0%84%e4%b9%8benum%e7%af%87.htm</link>
		<comments>http://www.jiehoo.me/c%e5%8f%8d%e5%b0%84%e4%b9%8benum%e7%af%87.htm#comments</comments>
		<pubDate>Tue, 23 Mar 2010 02:43:29 +0000</pubDate>
		<dc:creator>Cherami</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[反射]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[enum]]></category>

		<guid isPermaLink="false">http://www.jiehoo.me/?p=1006</guid>
		<description><![CDATA[因为最开始就遇到这个问题，所以单独提出来，不废话了，上代码吧 Assembly assembly = Assembly..Load(&#8220;MyDLL&#8221;); Type type = assembly.GetType(&#8220;MyDLL.MyEnum&#8221;); FieldInfo enumItem = type.GetField(&#8220;ENUM_TEST&#8221;); object enumValue= Enum.ToObject(type, enumItem.GetValue(type)); 最后一行代码得到的就是对应的enum对象的实例，可以传递给方法调用，type.GetField方法中的字符串其实就是enum中的字符串名字。要得到这个名字的列表也很容易： string[] names = Enum.GetNames(type);]]></description>
			<content:encoded><![CDATA[<p class='fp'>因为最开始就遇到这个问题，所以单独提出来，不废话了，上代码吧</p>
<p>Assembly assembly = Assembly..Load(&#8220;MyDLL&#8221;);<br />
Type type = assembly.GetType(&#8220;MyDLL.MyEnum&#8221;);<br />
FieldInfo enumItem = type.GetField(&#8220;ENUM_TEST&#8221;);<br />
object enumValue= Enum.ToObject(type, enumItem.GetValue(type));<br />
最后一行代码得到的就是对应的enum对象的实例，可以传递给方法调用，type.GetField方法中的字符串其实就是enum中的字符串名字。要得到这个名字的列表也很容易：</p>
<p>string[] names = Enum.GetNames(type);</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jiehoo.me/c%e5%8f%8d%e5%b0%84%e4%b9%8benum%e7%af%87.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>c#反射入门篇</title>
		<link>http://www.jiehoo.me/c%e5%8f%8d%e5%b0%84%e5%85%a5%e9%97%a8%e7%af%87.htm</link>
		<comments>http://www.jiehoo.me/c%e5%8f%8d%e5%b0%84%e5%85%a5%e9%97%a8%e7%af%87.htm#comments</comments>
		<pubDate>Tue, 23 Mar 2010 02:38:06 +0000</pubDate>
		<dc:creator>Cherami</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[反射]]></category>
		<category><![CDATA[c]]></category>

		<guid isPermaLink="false">http://www.jiehoo.me/?p=1004</guid>
		<description><![CDATA[主要就是几点 加载DLL 通过Assembly类的方法，主要是Load，还有其他一些方法可以自己研究下，Load方法可以传一个简单名，也可以传完整的限定名，传简单名(MyDLL)的时候，对应的DLL文件(MyDLL.dll)必须位于当前目录？（或者是PATH里面），如果是引用系统注册的DLL，则必须是完整的限定名，例如：MyDLL, Version=1.0.0.0, Culture=Neutral, PublickeyToken=d3cc2ceeafb73bc1 得到Type 这个没有什么，调用上面得到Assembly实例的GetType就行了 创建实例 得到Type以后，使用Activator.CreateInstance就可以了 调用方法 通过Type的GetMethod得到需要调用的MethodInfo对象，然后调用MethodInfo的Invoke方法。 废话少说，看代码吧： Assembly assembly = Assembly..Load(&#8220;MyDLL&#8221;); Type type = assembly.GetType(&#8220;MyDLL.MyClass&#8221;); object obj = Activator.CreateInstance(type); MethodInfo createMethod = type.GetMethod(&#8220;MyMethod&#8221;); object[] parameters = new object[1]; parameters[0] = &#8220;ParameterValue&#8221; object result = createMethod.Invoke(obj, parameters); 其实和Java差不多，就是java不需要load那一步，因为默认是从CLASSPATH中的所有jar中都可以load的，这个是JVM做的事情。如果需要load其他的不在CLASSPATH中的jar也是可以的，比较麻烦而已。]]></description>
			<content:encoded><![CDATA[<p class='fp'>主要就是几点</p>
<p><strong>加载DLL</strong></p>
<p>通过Assembly类的方法，主要是Load，还有其他一些方法可以自己研究下，Load方法可以传一个简单名，也可以传完整的限定名，传简单名(MyDLL)的时候，对应的DLL文件(MyDLL.dll)必须位于当前目录？（或者是PATH里面），如果是引用系统注册的DLL，则必须是完整的限定名，例如：MyDLL, Version=1.0.0.0, Culture=Neutral, PublickeyToken=d3cc2ceeafb73bc1</p>
<p><strong>得到Type</strong></p>
<p>这个没有什么，调用上面得到Assembly实例的GetType就行了</p>
<p><strong>创建实例</strong></p>
<p>得到Type以后，使用Activator.CreateInstance就可以了</p>
<p><strong>调用方法</strong></p>
<p>通过Type的GetMethod得到需要调用的MethodInfo对象，然后调用MethodInfo的Invoke方法。</p>
<p>废话少说，看代码吧：</p>
<p>Assembly assembly = Assembly..Load(&#8220;MyDLL&#8221;);<br />
Type type = assembly.GetType(&#8220;MyDLL.MyClass&#8221;);<br />
object obj = Activator.CreateInstance(type);<br />
MethodInfo createMethod = type.GetMethod(&#8220;MyMethod&#8221;);<br />
object[] parameters = new object[1];<br />
parameters[0] = &#8220;ParameterValue&#8221;<br />
object result = createMethod.Invoke(obj, parameters);</p>
<p>其实和Java差不多，就是java不需要load那一步，因为默认是从CLASSPATH中的所有jar中都可以load的，这个是JVM做的事情。如果需要load其他的不在CLASSPATH中的jar也是可以的，比较麻烦而已。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jiehoo.me/c%e5%8f%8d%e5%b0%84%e5%85%a5%e9%97%a8%e7%af%87.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>研究c#的反射机制</title>
		<link>http://www.jiehoo.me/%e7%a0%94%e7%a9%b6c%e7%9a%84%e5%8f%8d%e5%b0%84%e6%9c%ba%e5%88%b6.htm</link>
		<comments>http://www.jiehoo.me/%e7%a0%94%e7%a9%b6c%e7%9a%84%e5%8f%8d%e5%b0%84%e6%9c%ba%e5%88%b6.htm#comments</comments>
		<pubDate>Tue, 23 Mar 2010 02:24:09 +0000</pubDate>
		<dc:creator>Cherami</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[反射]]></category>
		<category><![CDATA[c]]></category>

		<guid isPermaLink="false">http://www.jiehoo.me/?p=1002</guid>
		<description><![CDATA[要做一个通用的自动测试框架，通过写xml文件完成Test Case的构建，由于打算支持COM和普通的DLL的方法调用，所以必须基于反射来做了。 大概看了下，好像也不是很复杂，就是得一步一步的试了。]]></description>
			<content:encoded><![CDATA[<p class='fp'>要做一个通用的自动测试框架，通过写xml文件完成Test Case的构建，由于打算支持COM和普通的DLL的方法调用，所以必须基于反射来做了。</p>
<p>大概看了下，好像也不是很复杂，就是得一步一步的试了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jiehoo.me/%e7%a0%94%e7%a9%b6c%e7%9a%84%e5%8f%8d%e5%b0%84%e6%9c%ba%e5%88%b6.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Regsvr32: 0&#215;80070716</title>
		<link>http://www.jiehoo.me/regsvr32-0x80070716.htm</link>
		<comments>http://www.jiehoo.me/regsvr32-0x80070716.htm#comments</comments>
		<pubDate>Fri, 19 Mar 2010 03:56:54 +0000</pubDate>
		<dc:creator>Cherami</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[DLL]]></category>
		<category><![CDATA[regsvr32]]></category>

		<guid isPermaLink="false">http://www.jiehoo.me/?p=1000</guid>
		<description><![CDATA[注册Dll的时候遇到这个错误，当然，我是在开发一个新的自己的DLL，或者是我修改已有的DLL增加我自己的东西，已经遇到好几次这个错误了。这个错误的对应的错误信息是： the resource name specified cannot be found in the image file 其实我已经遇到过几次了，上次解决过一次，但是忘记了，这次吸取教训，把它记下来。 我的错误是因为我增加了一些类，idl修改好了，rgs文件也都写好了，但是我忘记了在rc文件里面把那些rgs文件引用下。]]></description>
			<content:encoded><![CDATA[<p class='fp'>注册Dll的时候遇到这个错误，当然，我是在开发一个新的自己的DLL，或者是我修改已有的DLL增加我自己的东西，已经遇到好几次这个错误了。这个错误的对应的错误信息是：</p>
<p>the resource name specified cannot be found in the image file</p>
<p>其实我已经遇到过几次了，上次解决过一次，但是忘记了，这次吸取教训，把它记下来。</p>
<p>我的错误是因为我增加了一些类，idl修改好了，rgs文件也都写好了，但是我忘记了在rc文件里面把那些rgs文件引用下。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jiehoo.me/regsvr32-0x80070716.htm/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>_nt_symbol_path</title>
		<link>http://www.jiehoo.me/_nt_symbol_path.htm</link>
		<comments>http://www.jiehoo.me/_nt_symbol_path.htm#comments</comments>
		<pubDate>Mon, 11 Jan 2010 06:40:54 +0000</pubDate>
		<dc:creator>Cherami</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[调试]]></category>
		<category><![CDATA[symbol]]></category>

		<guid isPermaLink="false">http://www.jiehoo.me/?p=927</guid>
		<description><![CDATA[备忘下，设置这个环境变量后可以调试系统的DLL，可以自动从微软的网站下载PDB： Set _NT_SYMBOL_PATH = symsrv*symsrv.dll*f:\localsymbols*http://msdl.microsoft.com/download/symbols 不过加上以后调试超级慢，平时还是不要用了。]]></description>
			<content:encoded><![CDATA[<p class='fp'>备忘下，设置这个环境变量后可以调试系统的DLL，可以自动从微软的网站下载PDB：</p>
<p><strong>Set _NT_SYMBOL_PATH = symsrv*symsrv.dll*f:\localsymbols*http://msdl.microsoft.com/download/symbols</strong></p>
<p>不过加上以后调试超级慢，平时还是不要用了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jiehoo.me/_nt_symbol_path.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Interop的dll</title>
		<link>http://www.jiehoo.me/interop.htm</link>
		<comments>http://www.jiehoo.me/interop.htm#comments</comments>
		<pubDate>Mon, 11 Jan 2010 06:12:26 +0000</pubDate>
		<dc:creator>Cherami</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[COM]]></category>
		<category><![CDATA[DLL]]></category>
		<category><![CDATA[INTEROP]]></category>

		<guid isPermaLink="false">http://www.jiehoo.me/?p=925</guid>
		<description><![CDATA[底层是COM，但是会自动生成Interop的dll给.net平台用，问题是用regsvr32注册COM的时候好像不会更新那个Interop出来的DLL，遇到一个问题就是这个导致的，编译没有问题，运行的时候死活找不到新加的那个类，后来没有办法，搜索整个计算机，把COM的DLL和Interop的DLL全部搜索出来并且删除，再看Visual Studio，才发现它实际上使用的是c:\windows\assembly\GAC_MSIL下的那一份，你在搜索的时候把搜索系统文件和隐藏文件都勾上也不会去搜索这个目录下的东西。应该是有命令可以更新的，不过我现在还是暴力替换： c: cd \windows\assebmly attrib -r -h -s Desktop.ini del Desktop.ini 这样这个目录就可以进去看并且直接替换DLL了。]]></description>
			<content:encoded><![CDATA[<p class='fp'>底层是COM，但是会自动生成Interop的dll给.net平台用，问题是用regsvr32注册COM的时候好像不会更新那个Interop出来的DLL，遇到一个问题就是这个导致的，编译没有问题，运行的时候死活找不到新加的那个类，后来没有办法，搜索整个计算机，把COM的DLL和Interop的DLL全部搜索出来并且删除，再看Visual Studio，才发现它实际上使用的是c:\windows\assembly\GAC_MSIL下的那一份，你在搜索的时候把搜索系统文件和隐藏文件都勾上也不会去搜索这个目录下的东西。应该是有命令可以更新的，不过我现在还是暴力替换：</p>
<p>c:</p>
<p>cd \windows\assebmly</p>
<p>attrib -r -h -s Desktop.ini</p>
<p>del Desktop.ini</p>
<p>这样这个目录就可以进去看并且直接替换DLL了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jiehoo.me/interop.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Exchange的Journal邮件</title>
		<link>http://www.jiehoo.me/exchange%e7%9a%84journal%e9%82%ae%e4%bb%b6.htm</link>
		<comments>http://www.jiehoo.me/exchange%e7%9a%84journal%e9%82%ae%e4%bb%b6.htm#comments</comments>
		<pubDate>Wed, 25 Nov 2009 09:11:41 +0000</pubDate>
		<dc:creator>Cherami</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[exchange]]></category>
		<category><![CDATA[journal]]></category>
		<category><![CDATA[SourceOne]]></category>

		<guid isPermaLink="false">http://www.jiehoo.com/exchange%e7%9a%84journal%e9%82%ae%e4%bb%b6.htm</guid>
		<description><![CDATA[需要做Journal邮件的过滤，从Outlook里面看到的情况是，发件人是Microsoft Exchange on behalf of Xxx，而且正文是Journal Report，原始的邮件信息被作为附件了。开始还郁闷怎么弄，不过用SourceOne创建了Journal Activity以后，发现可以正常的处理，From得到的还是原始的发件人，而不是那个Microsoft Exchange on behalf of Xxx，邮件正文还是原来的邮件正文。不知道是SourceOne处理了这个问题还是。。。]]></description>
			<content:encoded><![CDATA[<p class='fp'>需要做Journal邮件的过滤，从Outlook里面看到的情况是，发件人是Microsoft Exchange on behalf of Xxx，而且正文是Journal Report，原始的邮件信息被作为附件了。开始还郁闷怎么弄，不过用SourceOne创建了Journal Activity以后，发现可以正常的处理，From得到的还是原始的发件人，而不是那个Microsoft Exchange on behalf of Xxx，邮件正文还是原来的邮件正文。不知道是SourceOne处理了这个问题还是。。。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jiehoo.me/exchange%e7%9a%84journal%e9%82%ae%e4%bb%b6.htm/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
