在IIS7中反映程序集

时间:2011-11-10 00:19:25

标签: c# asp.net .net reflection iis-7

我有一个应用程序,我使用反射来调用通过使用NetTiers生成的不同类中的方法。

为了做到这一点,我通过使用以下方式获取执行程序集来加载NetTiers服务程序集:

Assembly.GetExecutingAssembly().CodeBase

并按以下方式加载课程:

Assembly.LoadFrom(<Assembly Path using above>.dll).GetType(<className>)

这似乎在某些时候有效,但有时加载程序集会失败,但会出现以下异常:

  

从执行加载程序集时出错:C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Temporary ASP.NET Files \ services \ 21d6c367 \ aa208bcd \ assembly \ dl3 \ e825b934 \ 00f26fab_a39ecc01 \ .dll class:

和Stack Trace:

  

System.IO.FileNotFoundException:无法加载文件或程序集'file:/// C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Temporary ASP.NET Files \ services \ 21d6c367 \ aa208bcd \ assembly \ dl3 \ e825b934 \ 00f26fab_a39ecc01 \ .dll'或其中一个依赖项。该系统找不到指定的文件。文件名:'file:/// C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Temporary ASP.NET Files \ services \ 21d6c367 \ aa208bcd \ assembly \ dl3 \ e825b934 \ 00f26fab_a39ecc01 \ .dll'

     

在System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName,String codeBase,Evidence assemblySecurity,RuntimeAssembly locationHint,StackCrawlMark&amp; stackMark,Boolean throwOnFileNotFound,Boolean forIntrospection,Boolean suppressSecurityChecks)System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef,Evidence) assemblySecurity,StackCrawlMark&amp; stackMark,Boolean forIntrospection,Boolean suppressSecurityChecks)

     

at System.Reflection.RuntimeAssembly.InternalLoadFrom(String assemblyFile,Evidence securityEvidence,Byte [] hashValue,AssemblyHashAlgorithm hashAlgorithm,Boolean forIntrospection,Boolean suppressSecurityChecks,StackCrawlMark&amp; stackMark)

     

在System.Reflection.Assembly.LoadFrom(String assemblyFile)

     

警告:装配绑定日志记录已关闭。要启用程序集绑定失败日志记录,请将注册表值[HKLM \ Software \ Microsoft \ Fusion!EnableLog](DWORD)设置为1.注意:程序集绑定失败日志记录会导致一些性能损失。要关闭此功能,请删除注册表值[HKLM \ Software \ Microsoft \ Fusion!EnableLog]。

是否有更好的方法从程序集加载类,或者我错过了导致某些类发生此错误的内容,但对其他类没有?我正在使用IIS7运行应用程序。

2 个答案:

答案 0 :(得分:1)

尝试使用

Assembly.Load(Assembly.GetExecutingAssembly().GetName())

加载程序集。

但是我认为由于JIT内联等原因GetExecutingAssembly不一定可靠;出于与GetCallingAssembly相同的原因。 GetEntryAssembly可能更好 - 但是在Web应用程序中,由于Global.asax,它可能是另一个动态生成的程序集 - 即它不一定直接包含任何代码。

如果事先知道至少程序集的名称,那真的会好很多 - 然后你可以使用上面的Assembly.Load(AssemblyName)方法,而不必担心文件名(按文件名加载是并不总是一个好主意 - 如果你从一个与运行时加载的地方不同的地方加载,你可以在内存中获得重复的程序集。

答案 1 :(得分:0)

从给定的路径中您可以看到您没有为dll指定名称,请参阅\.dll