我正在尝试使用反射获取当前执行程序集的路径,以便在注册某些类型时使用。这将在静态/共用方法中调用。
Dim Path = System.Reflection.Assembly.GetExecutingAssembly.Location
此行代码会抛出StackOverflow异常,具体信息如下:
An unhandled exception of type 'System.StackOverflowException' occurred in mscorlib.dll
System.StackOverflowException
Data: unable to evaluate expression.
HelpLink: unable to evaluate expression.
HResult: unable to evaluate expression.
InnerException: unable to evaluate expression.
Message: unable to evaluate expression.
Source: unable to evaluate expression.
StackTrace: unable to evaluate expression.
TargetSite: unable to evaluate expression.
电话正在主线程上进行。我使用.Net 4.5/VS11 Beta。
值得注意的是,GetEntryAssembly,GetCallingAssembly等都是相同的。我以前从未见过(甚至读到过)这种行为 - 有人有什么建议吗?
编辑:
操作系统:Win7 x64 Ultimate 这是一个Winforms应用程序。
我有一个共享方法,应返回一个依赖项解析器(包装在我自己的类中以进行抽象)。
Private Shared _Resolver As IDependencyResolver
Public Shared Function QuickResolver() As IDependencyResolver
If _Resolver Is Nothing Then
Dim Container = New WindsorContainer
''Line below was breaking so I exploded it into multiple lines as shown above
Dim CurrentPathFilter = New AssemblyFilter(IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly.Location))
Container.Register(
Component.For(Of Interfaces.ISomeInterface)().
ImplementedBy(Of DAL.SomeType).LifestylePerThread)
''.... More registrations ....
Dim Resolver As New WindsorDependencyResolver(Container)
_Resolver = Resolver
End If
Return _Resolver
End Function
这段代码类似于单例模式(我知道初始化应该重构到不同的方法中去 - 我已经列入了我的任务列表)。
这个方法是从Winforms UI线程中这样被调用的:
Resolver = Common.DependencyResolverFactory.QuickResolver
ScanRepository = Resolver.Resolve(Of IRepository(Of Scan))()
异常是由
GetExecutingAssembly
这一行代码抛出的(这就是异常断开的地方)。我承认这很不寻常,所以我认为我的代码使它接近了SO,并且GetExecutingAssembly方法嵌套得足够深,导致溢出。
GetExecutingAssembly
行之前的某一行上设置断点以确保。 - Mark Hurd