Сбой приложения в InitializeComponent () - PullRequest
2 голосов
/ 31 октября 2011

Прежде всего, я использую Visual Studio 2010, Плагин Measurement Studio 2010 , C # и .NET 4.0.

Мое приложение получает данные с устройства USB и отображает их с помощью графиков.WaveformPlot() [который является частью Measurement Studio].Я могу нормально запустить приложение в режимах отладки и выпуска и даже запустить его напрямую, используя файл EXE в папках bin на компьютере разработчика.

Однако я просто не могу запустить его на другом компьютере.Я использую ClickOnce для создания установочного файла и папок, и я копирую папку публикации со своего компьютера разработчика на клиентский компьютер.Затем я запускаю установочный файл, ClickOnce загружает .NET (если он еще не установлен) и затем открывает приложение.Приложение показывает мой начальный диалог с просьбой выбрать COM-порт из множества доступных.Как только я это делаю, мой код проходит через InitializeComponent(), после чего должна отображаться основная форма.

Основная форма не открывается после начального поля.Используя операторы Debug.WriteLine, я смог сузить его до

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

Здесь происходит сбой.Это не показывает мне ни сообщения об ошибке, ни чего-либо.Он отлично работает на моем компьютере, но не на других компьютерах.Я включил файлы National Instruments DLL и другие компоненты National Instruments отлично инициализированы.Это просто тот, который не делает.Приложение некоторое время появляется в диспетчере задач Windows, а затем просто исчезает примерно через 10 секунд.

Что мне делать?

Обновление 1

Прочитав еще один не связанный вопрос о переполнении стека, я понял, что могу поставить 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' или одну из их зависимостей "

Скриншот того, что показывает Fuslogvw.exe


Fuslog Viewer показывает, что все сборки были успешно загружены. Я проверил на клиентском компьютере. Хотя, НациональныйВ DLL-файлах инструментов есть строка с надписью «Поиск в GAC неудачен», в то время как в других сборках этого нет.

DebugViewer отображает исключение, которое я распечатываю с использованием Debug.writeLine.не удалось загрузить одну из его зависимостей.

Я очень смущен.


Я попытался добавить ссылки в проект, используя декомпилятор для проверки ссылок, используя другие программы установки (другиечем ClickOnce) и ни один из них, кажется, никуда меня не приводит.: (


Обновление 4

Я только что узнал вчера, чтоПриложение устанавливалось и работало нормально на 64-битных системах.Два компьютера, на которых я пробовал это раньше, были 32-битными системами Windows 7.Я смотрю, может ли это как-то помочь мне.Приложение было скомпилировано на моем 64-битном ноутбуке под управлением Windows 7. В раскрывающемся меню «Платформа» в «Построить» в свойствах проекта отображается «Активно (x86), и в качестве цели платформы выбрано« Любой ЦП ».

Ответы [ 6 ]

4 голосов
/ 11 ноября 2011

Потратив много времени на эту проблему, я поговорил с кем-то из National Instruments, и он помог мне решить проблему, с которой я столкнулся.Ранее я заметил, проверяя зависимости модуля mstudiocommon.2010.msm, что он (mstudiocommon.2010.msm) искал файл vs100_crt_x86.msm, но установщик обнаружил (и добавил) a vs90_crt_x86.msm (в «Обнаруженные зависимости»).проекта установщика).Щелкнув правой кнопкой мыши проект установщика и добавив MSM-файл VS100 вручную, я решил проблему, которая возникла у меня.

Ниже приведен скриншот зависимостей модулей, которые я мог видеть для модулей слияния mstudiocommon и mstudioui: imagemstudiocommon and mstudioui merge modules.">

Хотя я не совсем понял, почему VisualСтудия обнаруживала VS90 вместо VS100, я рад, что наконец-то исправил эту проблему, и оставлю это на другой день.

2 голосов
/ 01 ноября 2011

Попробуйте Fusion Log Viewer из SDK, чтобы определить, какая библиотека вызывает проблему.

0 голосов
/ 30 августа 2015

У меня была та же проблема, и когда в вашем проекте было множество ссылок, очень трудно найти, какая сборка на самом деле отсутствует. Особенно, если у вас есть эта проблема на клиентском компьютере без Visual Studio.

После часа или двух возни с fuslogvw.exe и не имея возможности получить четкий ответ, я просто погуглил "обнаружение отсутствующих сборок .net application" и обнаружил http://www.amberfish.net/

Это работает как шарм, есть бесплатная пробная версия, и разработчик просит только очень демократичную цену ... Очень круто !!

PS. Я не имею отношения к янтарной рыбе, сегодня я впервые узнал об этом инструменте. инструмент, созданный этим парнем, должен быть в стандартном наборе инструментов Windows. Как раз то, что мне нужно.

0 голосов
/ 03 февраля 2015

Я думаю, что получилось так, что кто-то установил приложение в целевой системе, которая использует только подмножество последних компонентов 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>
0 голосов
/ 04 ноября 2011

Вы можете использовать Reflector или JustDecompile, чтобы получить то, что нужно для ссылок «NationalInstruments.Common.Native.dll».Судя по звукам, хотя со словом Native в названии DLL это может быть обертка вокруг какой-то другой родной Win32 C dll.У вас есть те в той же папке?Это также может быть обертка вокруг COM DLL, которая, возможно, не зарегистрирована?

0 голосов
/ 31 октября 2011

Без логов и сообщений об ошибках слишком сложно найти, что не так. Вы должны поместить try catch в свой код, где вы пытаетесь получить доступ к компонентам библиотеки waveformPlot и распечатать сообщение об ошибке и трассировку стека. После того, как вы увидите, чего не хватает.

...