反射GetExecutingAssembly抛出StackOverflow异常

4

我正在尝试使用反射获取当前执行程序集的路径,以便在注册某些类型时使用。这将在静态/共用方法中调用。

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方法嵌套得足够深,导致溢出。

你怎么能确定溢出是在那一行而不是你代码中的另一行? - Yasser Zamani
1
你能展示一下这行代码的上下文吗?这个方法还做了哪些其他事情? - Botz3000
你在哪个操作系统上尝试这段代码? - Romil Kumar Jain
1
不支持使用动态程序集获取位置。 - Romil Kumar Jain
我猜测你的解析器正在被调用以解析程序集。在GetExecutingAssembly行之前的某一行上设置断点以确保。 - Mark Hurd
显示剩余2条评论
1个回答

0
使用以下示例代码获取程序集目录。
System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location))

或者

Path.GetDirectoryName(typeof(Foo).Assembly.ManifestModule.FullyQualifiedName)

哇...没有什么比使用已经出现在Q中的代码行作为答案更好的了...IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly.Location) - 请参见完整示例的第6行。话虽如此,我开始认为GetExecutingAssembly是一个误导 - 最有可能的是调用嵌套了一点,而这种嵌套恰好足以在其他东西已经_几乎_填满堆栈之后使其达到最大值。 - Basic
看起来你已经能够得到路径了,但是第6行的"new AssemblyFilter()"导致了错误。请将此语句拆分成两行。首先获取路径,然后将此路径传递给AssemblyFilter构造函数。 - Romil Kumar Jain
谢谢您的回答,但是如果您看一下第一个片段,将 Dim Path = System.Reflection.Assembly.GetExecutingAssembly.Location 放在单独的一行上仍然会抛出异常 - 我已经将其从构造函数中分离出来以防这是问题所在... - Basic
我还没有 - 但我需要了解为什么会抛出异常。值得注意的是,第二个选项需要一个类型,这可能会有问题,因为这个类的目的是在给定目录中注册所有程序集中的类型(至少是由我签名的所有程序集),因此它必须能够处理我尚不知道任何类型的程序集。 - Basic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接