2

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

4

2 回答 2

1

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

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

  • [Uninteresting native and / or external code]
  • SomeClassInYourInstaller.SomeMethod() <-- this is the responsible method
  • SomeOtherStuff.SomeMethod()
  • ...etc...
于 2009-10-14T22:13:57.857 回答
0

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

于 2009-10-14T21:14:38.807 回答