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 &quot;${nunit2.dir}/nunit-console.exe&quot; &quot;${build.dir}/bin/${nant.project.name}.dll /xml:${build.dir}/results/${nant.project.name}.dll-results.xml /nologo&quot; /a &quot;${nant.project.name}&quot; /o &quot;${build.dir}/results/${nant.project.name}.coverage.xml&quot;"/>
    
</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  阅读(1366)  评论(1编辑  收藏  举报

导航