首先,我使用的是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.run
和form1 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'作为平台目标。
答案 0 :(得分:4)
在这个问题上花了很多时间后,我和National Instruments的某个人交谈过,他帮助我解决了我遇到的问题。我之前注意到,通过检查mstudiocommon.2010.msm
的模块依赖关系,它(mstudiocommon.2010.msm
)正在查找vs100_crt_x86.msm
文件,但安装程序检测到(并添加了){{1} (在安装程序项目的“Detected Dependencies”中)。右键单击安装程序项目并手动添加VS100 .msm文件修复了我遇到的问题。
下面是我可以看到的vs90_crt_x86.msm
和mstudiocommon
合并模块的模块依赖关系的屏幕截图:
虽然,我不太明白为什么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的默认工具包中。正是我需要的。