【问题标题】:Can I determine what triggered an assembly load?我可以确定是什么触发了装配负载吗?
【发布时间】:2009-10-12 18:41:38
【问题描述】:

当 Windows 服务安装程序因“错误 1001。无法在 MyService.exe 程序集中获取安装程序类型”而崩溃时。所以它无法加载 MyServiceInstaller。 Fusion 日志记录显示它在尝试查找我的 Data.dll 程序集时失败。

问题是,它不应该需要加载 Data.dll 来创建我的服务安装程序对象。我认为直到调用包含这些类型的方法之前才触发类型加载。一些 MyServiceInstaller 方法引用来自 Data.dll 的类型,但不引用任何 ctor。

就好像加载 MyService.exe 或探测 MyServiceInstaller 的行为调用了 Data.dll 的加载。

据我了解,融合日志不会告诉我我需要知道什么。到那时为时已晚。我需要知道加载 MyServer.exe 或探测触发 Data.dll 加载的 MyServiceInstaller 是什么。

有一个业务需求,Data.dll 不能放在 MyService.exe 旁边。事实上,这确实解决了这个问题。我有一个自定义的 AssemblyResolve 事件,它在正常运行时加载 Data.dll。

【问题讨论】:

    标签: assemblies fusion


    【解决方案1】:

    尝试将调试器附加到安装程序,并在引发异常时使其中断(您可以在 Visual Studio 的调试/异常中进行设置)。通常情况下,当程序集加载失败时,安装程​​序内部应该有一个FileNotFoundException 或类似的东西,这可能在其他地方被捕获,但是如果你让调试器在异常被抛出时中断(并且不是(如果未处理),您可以介入并获取堆栈跟踪,这将有助于您发现问题的确切原因。

    您应该在堆栈跟踪中看到类似的内容:

    • [Uninteresting native and / or external code]
    • SomeClassInYourInstaller.SomeMethod() <-- this is the responsible method
    • SomeOtherStuff.SomeMethod()
    • ...etc...

    【讨论】:

    • 如何将调试器附加到安装程序..我试图这样做,但我不能这样做
    【解决方案2】:

    也许Data.dll中定义了一个类型的实例变量(字段);当加载 MyServiceInstaller 时,所有字段的类型都需要可用,即使它们没有被使用,因为如果创建了实例,则正在编译该类。

    【讨论】:

      猜你喜欢
      • 2021-03-14
      • 1970-01-01
      • 2017-07-22
      • 1970-01-01
      • 1970-01-01
      • 2013-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多