我可以确定触发装配负载的原因吗?

时间:2009-10-12 18:41:39

标签: assemblies fusion

当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。

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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