有人请帮助我,因为我要失去理智。
我在C#/ Visual Studio 2015 / .Net 4.6.1中创建了一个Windows服务。然后我使用内置模板为它创建了一个简单的安装程序。自定义操作,ProjectInstaller类 - 一切正常。
我在几台计算机上运行此安装程序,一切运行正常,直到我尝试将其安装在特定客户端的Windows Server 2012上,突然间我得到了
Unable to get installer types in the [xxx].exe assbmely. --> Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.
到目前为止,我所尝试的是:
在服务器上安装了.Net 4.6.1(之前没有安装过)。
将所有服务的依赖项切换为CopyLocal = false,然后再返回。
Ran Fusion Log并没有任何绑定错误。
使用完整日志记录运行MSI并获得一个完全没用的日志,只会再次显示相同的错误。
在ProjectInstaller类中的所有代码路径周围放置try / catch。没有帮助。
这让我疯狂。如果没有办法记录正在进行的操作,我怎么能确切地知道哪个dll /类型给我问题?!
有人可以帮忙吗?
答案 0 :(得分:3)
这是你的自定义动作组件,即服务。它需要的类型来自安装程序程序集,它使用反射加载和实例化以发现安装程序类。 Fusion日志显示没有错误,原因相同,通过反射创建和实例化。在内部,没有Windows Installer支持托管代码安装程序类,因此有一个C ++填充程序Dll代表您完成所有这些,并且没有来自此黑盒Dll的诊断。
一些建议:
您没有发布您的设置(TargetPlatform)的架构(64/32),如果您的程序集是AnyCpu,64位,32位等。某些Windows服务器不安装32位子系统默认-WoW64是可选的 - 因此对于32位的任何东西都可能根本不支持。如果是这种情况,则需要构建64位安装并使程序集成为64位。
您可能依赖于另一个不可用的程序集。这似乎不太可能,但请记住。
我认为这个问题已得到修复,但是这可以让您了解托管代码自定义操作会发生什么,以及它们之前在64位系统上失败的原因。同样,这取决于您的设置的TargetPlatform以及您的安装是x86还是x64,以及Server 2016是否支持安装的WoW64。
https://blogs.msdn.microsoft.com/heaths/2006/02/01/64-bit-managed-custom-actions-with-visual-studio/
无论如何,这些可能会指向您的解决方案。顺便说一句,“真正的安装程序”,如果我可以使用该术语,则不使用托管代码来安装服务,因为Windows Installer具有内置支持来执行此操作。