2

首先,我使用 Visual Studio 2010、Measurement Studio 2010 插件、C# 和 .NET 4.0。

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

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

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

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

它在这里崩溃。它没有向我显示任何错误消息或任何东西。它在我的开发计算机上运行良好,但在其他计算机上却不行。我包含了National Instruments DLL 文件,并且其他 National Instruments 组件都已初始化。只是这一个没有。该应用程序会在 Windows 任务管理器中显示一段时间,然后在 10 秒后消失。

我应该怎么办?

更新 1

在阅读了关于 Stack Overflow 的另一个不相关的问题后,我意识到我可以将 theApplication.run和 theform1 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”或其依赖项之一”

Fuslogvw.exe 显示内容的屏幕截图


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

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

我很困扰。


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


更新 4

我昨天才发现该应用程序在 64 位系统上安装和运行良好。我之前试过的两台电脑都是 32 位的 Windows 7 系统。我正在寻找是否可以以某种方式帮助我。该应用程序是在我的 64 位 Windows 7 开发笔记本电脑上编译的。项目属性下“构建”中的“平台”下拉菜单显示“活动(x86)”,我将“任何 CPU”作为平台目标。

4

6 回答 6

4

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

下面是我可以看到的mstudiocommonmstudioui合并模块的模块依赖项的屏幕截图: 我可以看到 <code>mstudiocommon</code> 和 <code>mstudioui</code> 合并模块的模块依赖项的屏幕截图。

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

于 2011-11-11T17:29:15.260 回答
2

尝试使用 SDK 中的 Fusion Log Viewer 来确定导致问题的库。

于 2011-10-31T21:11:51.517 回答
0

您可以使用 Reflector 或 JustDecompile 来获取引用“NationalInstruments.Common.Native.dll”所需的内容。从它的声音来看,虽然 DLL 名称中带有 Native 一词,但它可能是其他本机 Win32 C dll 的包装器。同一个文件夹里有吗?它也可能是未注册的 COM dll 的包装器?

于 2011-11-04T14:01:14.297 回答
0

如果没有日志和错误消息,就很难找到问题所在。您应该try catch在代码中放置一个尝试访问库组件waveformPlot 并打印错误消息和堆栈跟踪的位置。之后您可以看到缺少的内容。

于 2011-10-31T15:18:21.900 回答
0

我认为发生的情况是有人在目标系统上安装了仅使用最新 NI 组件子集的应用程序。为了解决这个问题,我在 app.config 中添加了 bindingRedirect。有效。

<?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>
于 2015-02-03T20:12:26.513 回答
0

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

在使用 fuslogvw.exe 并没有得到明确的答案后,我只是用谷歌搜索“检测丢失的程序集 .net 应用程序”并找到http://www.amberfish.net/

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

PS。我与 amberfish 没有任何关系,今天是我第一次发现这个工具。这家伙构建的工具应该在Windows的默认工具包中。正是我需要的。

于 2015-08-30T11:00:13.623 回答