应用程序在InitializeComponent()中崩溃

时间:2011-10-31 15:05:55

标签: c# winforms initializecomponent measurement-studio

首先,我使用的是Visual Studio 2010,Measurement Studio 2010 plugin,C#和.NET 4.0。

我的应用程序从USB设备接收数据,并使用WaveformPlot() [这是Measurement Studio的一部分]绘制数据图表。我能够在调试和发布模式下运行应用程序,甚至可以直接使用开发计算机上bin文件夹中的EXE文件运行它。

但是,我根本无法在另一台计算机上运行它。我正在使用ClickOnce创建安装文件和文件夹,并将发布文件夹从我的开发计算机复制到客户端计算机。然后我运行安装文件,ClickOnce下载.NET(如果尚未安装),然后打开应用程序。应用程序显示我的初始对话框,要求我从许多可用的COM端口中选择一个COM端口。一旦我这样做,我的代码将通过InitializeComponent(),然后主要表单将显示出来。

初始框后,主窗体无法打开。使用Debug.WriteLine语句,我已经能够将其缩小到

this.waveformPlot = new NationalInstruments.UI.WaveformPlot();

这里崩溃了。它没有显示任何错误消息或任何内容。它在我的开发计算机上工作正常,而不是在其他计算机上。我包含National Instruments DLL文件和其他NI组件初始化正常。只是这一个没有。应用程序在Windows任务管理器中显示一段时间,然后在10秒后消失。

我该怎么办?

更新1

在阅读Stack Overflow上另一个不相关的问题之后,我意识到我可以将Application.runform1 mainform = new form1()放在try-catch块中。

  

System.TypeInitializationException:'NationalInstruments.UI.Internal.WaveformPlotElement'的类型初始化程序抛出异常。 - > System.IO.FileNotFoundException:无法加载文件或程序集“NationalInstruments.Common.Native.dll”或其依赖项之一。指定的模块无法找到。

由于我现在至少知道这是一个例外,我将继续努力,尝试找出哪个DLL丢失,为什么,并更新这个问题。

更新2

我检查了发布文件夹中的应用程序文件,它确实包含了'NationalInstruments.Common.Native.dll'。我不知道为什么它无法加载它。

更新3

我在客户端计算机上运行了Fusion Log Viewer,发现NationalInstruments.Common.Native.dll已成功加载。但是,调试异常消息仍然显示在OP中,

  

无法加载文件或程序集“NationalInstruments.Common.Native.dll”或其依赖项之一“

Screenshot of what the Fuslogvw.exe shows


Fuslog Viewer显示已成功加载所有程序集。我检查了客户端计算机。虽然,National Instruments DLL文件中有一行表示“GAC查找不成功”,而其他程序集则没有。

DebugViewer显示我使用Debug.writeLine打印出的异常。这表明无法加载NationalInstruments.Common.Native.dll或其中一个依赖项。

我很困惑。


我尝试添加对项目的引用,使用反编译器检查引用,使用其他安装程序(ClickOnce除外)并且它们似乎都没有让我到任何地方。 :(


更新4

我昨天刚刚发现应用程序正在安装并在64位系统上正常运行。之前尝试过的两台计算机是32位Windows 7系统。 我希望看看这能否以某种方式帮助我。 该应用程序是在我的64位Windows 7开发笔记本电脑上编译的。项目属性下“构建”中的“平台”下拉菜单显示“活动(x86),我有'任何CPU'作为平台目标。

6 个答案:

答案 0 :(得分:4)

在这个问题上花了很多时间后,我和National Instruments的某个人交谈过,他帮助我解决了我遇到的问题。我之前注意到,通过检查mstudiocommon.2010.msm的模块依赖关系,它(mstudiocommon.2010.msm)正在查找vs100_crt_x86.msm文件,但安装程序检测到(并添加了){{1} (在安装程序项目的“Detected Dependencies”中)。右键单击安装程序项目并手动添加VS100 .msm文件修复了我遇到的问题。

下面是我可以看到的vs90_crt_x86.msmmstudiocommon合并模块的模块依赖关系的屏幕截图: Screenshot of the module dependencies that I could see for the <code>mstudiocommon</code> and <code>mstudioui</code> merge modules.

虽然,我不太明白为什么Visual Studio会检测到VS90而不是VS100,但我很高兴我终于解决了这个问题,我将把这个问题留了一天。

答案 1 :(得分:2)

从SDK尝试Fusion Log Viewer,以确定导致问题的库。

答案 2 :(得分:0)

没有日志和错误消息,很难找到错误。您应该在代码中放置try catch,尝试访问库组件waveformPlot并打印错误消息和堆栈跟踪。在你看到缺少的东西之后。

答案 3 :(得分:0)

您可以使用Reflector或JustDecompile来获取“NationalInstruments.Common.Native.dll”所需的引用。从它的声音虽然在DLL的名称中使用单词Native,但它可能是另一个本机Win32 C dll的包装器。你有那些在同一个文件夹?它也可能是COM dll的包装器,可能没有注册?

答案 4 :(得分:0)

我认为发生的事情是有人在目标系统上安装了仅使用最新NI组件子集的应用程序。要解决此问题,我已将bindingRedirect添加到app.config。它奏效了。

<?xml version="1.0"?>
<configuration>
 <startup>
  <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>
 </startup>
 <runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
   <dependentAssembly>
    <assemblyIdentity name="NationalInstruments.Common" publicKeyToken="DC6AD606294FC298" culture="neutral"/>
    <bindingRedirect oldVersion="0.0.0.0-13.0.40.190" newVersion="9.1.40.159"/>
   </dependentAssembly>
   <dependentAssembly>
    <assemblyIdentity name="NationalInstruments.Common.Native" publicKeyToken="DC6AD606294FC298" culture="neutral"/>
    <bindingRedirect oldVersion="0.0.0.0-13.0.40.190" newVersion="9.1.40.159"/>
   </dependentAssembly>
  </assemblyBinding>
 </runtime>
</configuration>

答案 5 :(得分:0)

我遇到了同样的问题,当你的项目中有大量的引用时,很难找到实际上缺少的程序集。特别是如果您在没有Visual Studio的客户端计算机上遇到此问题。

经过一两个小时搞乱了fuslogvw.exe并且无法得到明确的答案我只是用Google搜索&#34;检测丢失的程序集.net应用程序&#34;并找到了http://www.amberfish.net/

它有点像魅力,有一个免费试用,开发商只要求一个非常民主的价格......很酷!!

PS。我是不依附于琥珀鱼的,这是我第一次发现这个工具。这个人建立的工具应该在Windows的默认工具包中。正是我需要的。