.net应用程序将无法运行。在dest机器(相同的源)上进行编译时,它确实有效。为什么?

时间:2010-05-26 11:28:30

标签: .net dll windows-services dependencies 32bit-64bit

我有一项需要在客户机上部署的服务。

目标机器是64位。我的开发机器也是64位。 该应用程序非常简单,侦听端口并执行一些数据库操作。它的目标是.net 3.5

当我部署Anycpu,X64或X86版本时,该东西将不会安装在客户端计算机上。

我检查了dependencywalker,它列出了: devmgr.dll ieshims.dll wer.dll

无论如何......我在客户端机器上安装了visual studio 2008 ...查看所有来源。我不改变一件事并编译。将exe复制到它的dest位置......你知道什么......它可以工作。

Dependencywalker仍然列出了相同的依赖性问题。

在这台机器上编译它的行为怎么能给我一个不同的exe?

编辑: 当我说它没有安装。我的意思是installUtil会出错:

安装阶段发生异常。 System.InvalidOperationException:无法在C:\ services中获取安装程序类型 \ incomingnotifications \ IncomingNotifications.exe程序集。   在System.Configuration.Install.AssemblyInstaller.InitializeFromAssembly()   在System.Configuration.Install.AssemblyInstaller.Install(IDictionary savedSt 吃了)   在System.Configuration.Install.Installer.Install(IDictionary stateSaver)   在System.Configuration.Install.TransactedInstaller.Install中(IDictionary已保存 州) 抛出了内部异常System.Reflection.ReflectionTypeLoadException h以下错误消息:无法加载一个或多个请求的类型 。检索LoaderExceptions属性以获取更多信息。   在System.Reflection.Module._GetTypesInternal(StackCrawlMark& stackMark)   在System.Reflection.Module.GetTypes()   在System.Configuration.Install.AssemblyInstaller.GetInstallerTypes(汇编 ASSEM)   在System.Configuration.Install.AssemblyInstaller.InitializeFromAssembly()

还...在使用visual studio进行编译之前,我检查过该服务仍然无法安装。编译完成后就可以了。

EDIT2: 在devmachine上再次编译并发送二进制文件会导致相同的错误。在本地编译给我一个有效的exe

3 个答案:

答案 0 :(得分:1)

目前还不是很清楚你的问题究竟是什么,因为你说它不会安装在机器上。你什么意思?安装失败?或者你只是将它复制并尝试运行它?你收到任何错误信息吗?

你安装了这项服务吗?或者这是作为构建的一部分完成的吗?这可能解释了为什么将它复制到机器上不起作用但是构建它确实...一旦你在新机器上安装了VS,在dev机器上编译的exe是否有效?

我会首先检查你的目标机器上是否有正确的.net版本,因为安装VS会把它放在那里,如果不是的话。

我会使用像procmon这样的工具来查看服务启动时会发生什么,以检查它是不是缺少一些dll。

更多信息可能有助于更快地得到答案......

编辑:

在您编辑后,我做了一些谷歌搜索并遇到了this thread这提出了一些选项,但主要的一个似乎治愈了一些(假设你没有依赖,不能要解决的问题是你没有以管理员身份运行install util:

引用帖子:

您正在遇到'标准用户'。我猜你可能是在一个本地管理员组成员的帐户下运行,但启用了Vista UAC,即使管理员以标准用户身份运行,直到他们运行一个发出明确管理请求的应用程序 - 此时你通常获得管理员提升提示。 InstallUtil.exe未标记为明确要求admin,因此失败。

创建运行InstallUtil youService.exe的cmd脚本,并将脚本设置为require admin或执行'runas / user:Administrator cmd.exe'并从那里运行InstallUtil。

如果这不是问题,那么另一个人建议:

我发现安装在32位框架中使用InstallUtil.exe时有效,但在64位框架中运行InstallUtil.exe时会生成System.Reflection.ReflectionTypeLoadException。这是我需要在我的项目中设置的设置还是我包含的64位不支持的结构? (虽然我认为它向后兼容)。

不确定这些中的任何一个是否会有所帮助,但您永远不会知道...

答案 1 :(得分:0)

从.NET Framework 2.0版开始,32位版本的公共语言运行库(CLR)继续只附带32位版本的Installer工具,但64位版本的CLR发布同时使用32位和64位版本的Installer工具。使用64位CLR时,使用32位安装程序工具安装32位程序集,使用64位安装程序工具安装64位和Microsoft中间语言程序集。否则,两个版本的Installer工具的行为都相同。

Source

答案 2 :(得分:0)

不要使用Framework 64文件夹中的installutil。使用常规的Framework文件夹。尽管你在64台计算机上运行它,它应该可以在那里工作。