Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# IIS7中的反射组件_C#_Asp.net_.net_Reflection_Iis 7 - Fatal编程技术网

C# IIS7中的反射组件

C# IIS7中的反射组件,c#,asp.net,.net,reflection,iis-7,C#,Asp.net,.net,Reflection,Iis 7,我有一个应用程序,在其中我使用反射来调用方法,这些方法是通过使用NetTiers生成的不同类 为此,我正在加载NetTiers服务程序集,方法是使用以下方法获取执行程序集: Assembly.GetExecutingAssembly().CodeBase 并通过以下方式加载该类: Assembly.LoadFrom(<Assembly Path using above>.dll).GetType(<className>) Assembly.LoadFrom(.dll)

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

为此,我正在加载NetTiers服务程序集,方法是使用以下方法获取执行程序集:

Assembly.GetExecutingAssembly().CodeBase
并通过以下方式加载该类:

Assembly.LoadFrom(<Assembly Path using above>.dll).GetType(<className>)
Assembly.LoadFrom(.dll).GetType()
这似乎在某些时候起作用,但有时加载程序集失败,出现以下异常:

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

和堆栈跟踪:

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

在System.Reflection.RuntimeAssembly.\n在System.Reflection.RuntimeAssembly.InternalLoadAssemblyName中加载(AssemblyName文件名、字符串代码基、证据assemblySecurity、RuntimeAssembly位置提示、StackScrawMark和stackMark、Boolean throwOnFileNotFound、Boolean ForInspection、Boolean suppressSecurityChecks)(AssemblyName assemblyRef、证据assemblySecurity、StackScrawMark和stackMark、用于内省的布尔值、布尔值suppressSecurityChecks)

位于System.Reflection.RuntimeAssembly.InternalLoadFrom(字符串汇编文件、证据安全性证据、字节[]哈希值、AssemblyHashAlgorithm哈希算法、Boolean ForInspection、Boolean suppressSecurityChecks、StackScrawMark和stackMark)

位于System.Reflection.Assembly.LoadFrom(字符串汇编文件)

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


是否有更好的方法从程序集中加载类,或者我是否遗漏了导致某些类(而不是其他类)发生此错误的内容?我正在使用IIS7运行应用程序。

从给定的路径可以看出,您尚未指定dll的名称请参见
\.dll
尝试使用

Assembly.Load(Assembly.GetExecutingAssembly().GetName())
加载程序集

然而,我认为由于JIT内联等原因,
getExecutionGassembly
不一定可靠;原因与
GetCallingAssembly
GetEntryAssembly
可能更好-但在web应用程序中,由于Global.asax,它可能是另一个动态生成的程序集-也就是说,它不需要您可以直接包含任何代码


实际上,如果您至少提前知道程序集的名称,然后您就可以像上面那样使用
assembly.Load(AssemblyName)
方法,而不必担心文件名,那会好得多(按文件名加载并不总是一个好主意-如果从与运行时加载位置不同的位置加载,则可以在内存中获得重复的程序集。

我在程序集的路径中指定.dll。@Steve-可能是调用通过“匿名托管”程序集从某些动态代码中发出。或者至少that实际调用已内联到其中。但是,如果类名为assembly qualified,则不需要首先加载程序集。如果不是,则此模式不可靠,并且需要更安全的方法提前了解程序集。
GetEntryAssembly()
将更可靠,但不一定正确。