Assembly.LoadFrom()与Assembly.LoadFile()方法的困扰
最近在研究 CruiseControl.NET 与 NCover 、NUnit 、NAnt 的集成构建,在用 DotNetTools Workflow 0.1.0版(移植自osworkflow的.NET实现版)作为测试例子时,碰到了问题,郁闷了两天,最后总算搞明白问题所在了。
我在DotNetTools Workflow 源代码-DotNetTools.Test工程中的NAnt脚本中添加了一个Target,用于执行NCover:
<property name="nunit2.dir" value="D:\Program Files\DotNet\devTools\NUnit 2.2.2\bin" />
<target name="ncover" depends="build">
<exec
program="D:\Program Files\DotNet\devTools\NCover\NCover.Console.exe"
workingdir="${build.dir}/results"
commandline="/c "${nunit2.dir}/nunit-console.exe" "${build.dir}/bin/${nant.project.name}.dll /xml:${build.dir}/results/${nant.project.name}.dll-results.xml /nologo" /a "${nant.project.name}" /o "${build.dir}/results/${nant.project.name}.coverage.xml""/>
</target>
然后我在命令行运行该脚本:>nant ncover,在NUnit即将运行完成后,出现错误(如下图),但是我直接在NUnit中运行DotNetTools.Test测试工程,并没有错误。
经过艰苦的跟踪调试,终于发现问题出在:DotNetTools.Workflow工程中Util\Vsa\VsaBase.cs的Prepared()方法,其Assembly.LoadFile(Path.GetFullPath(assembly))会导致上图所示错误,
if (config!=null)
{
foreach(String assembly in config.References)
control.AddReference(Assembly.LoadFile(Path.GetFullPath(assembly)));
}
//增加 System
control.AddReference(typeof(Console));
原来Assembly.LoadFile()方法内部需要对assembly进行严格的安全权限检查。
在我试过强签名,安全策略等等一系列方法后,问题仍然存在,又郁闷了一天...
今天偶然在发现cnblogs上发现 让人哭笑不得的“Unable to load one or more of the types in the assembly”问题的解决! 这篇文章,我也如法炮制,将Assembly.LoadFile()改为Assembly.LoadFrom()...。OK!
这里还有一篇同我一样可怜的人儿: Assembly.LoadFile和Assembly.LoadFrom
呵呵,Assembly.LoadFile()是.net1.1的新方法,调用还出错,那它有何用?与Assembly.LoadFrom()又有何区别?呵呵,空了再仔细研究这问题吧!问题总算解决了,不过,同提到的前文作者一样:让人哭笑不得
盼有路过的高手给予指点迷津,谢了!
posted on 2006-01-03 15:31 flashcloud 阅读(1371) 评论(1) 编辑 收藏 举报