我有一个应用程序,我使用反射来调用通过使用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运行应用程序。
答案 0 :(得分:1)
尝试使用
Assembly.Load(Assembly.GetExecutingAssembly().GetName())
加载程序集。
但是我认为由于JIT内联等原因GetExecutingAssembly
不一定可靠;出于与GetCallingAssembly
相同的原因。 GetEntryAssembly
可能更好 - 但是在Web应用程序中,由于Global.asax,它可能是另一个动态生成的程序集 - 即它不一定直接包含任何代码。
如果事先知道至少程序集的名称,那真的会好很多 - 然后你可以使用上面的Assembly.Load(AssemblyName)
方法,而不必担心文件名(按文件名加载是并不总是一个好主意 - 如果你从一个与运行时加载的地方不同的地方加载,你可以在内存中获得重复的程序集。
答案 1 :(得分:0)
从给定的路径中您可以看到您没有为dll指定名称,请参阅\.dll