#c# #winforms #initializecomponent #measurement-studio
#c# #winforms #initializecomponent #измерение-студия
Вопрос:
Во-первых, я использую 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();
Здесь он выходит из строя. Он не показывает мне никакого сообщения об ошибке или чего-то еще. Он отлично работает на моем компьютере разработчика, но не на других компьютерах. Я включил DLL-файлы National Instruments, и другие компоненты National Instruments инициализируются нормально. Просто этого не происходит. Приложение некоторое время отображается в диспетчере задач Windows, а затем просто исчезает примерно через 10 секунд.
Что мне делать?
Обновление 1
Прочитав еще один несвязанный вопрос о переполнении стека, я понял, что могу поместить Application.run
и form1 mainform = new form1()
в блок try-catch .
Система.Исключение TypeInitializationException: инициализатор типа для ‘NationalInstruments.UI.Internal.WaveformPlotElement’ выдал и исключение. —> System.IO.FileNotFoundException: не удалось загрузить файл или сборку ‘NationalInstruments.Обычный.Туземец.dll’ или одна из его зависимостей. Указанный модуль не удалось найти.
Поскольку я, по крайней мере, знаю, что теперь это исключение, я поработаю над этим, попытаюсь выяснить, какая DLL отсутствует и почему, и обновлю этот вопрос.
Обновление 2
Я проверил файлы приложения, которые находятся в папке публикации, и они содержат ‘NationalInstruments.Обычный.Native.dll «. Я понятия не имею, почему он не может его загрузить.
Обновление 3
Я запустил Fusion Log Viewer на клиентском компьютере и увидел, что NationalInstruments.Common.Native.dll
он был успешно загружен. Но все же появляется сообщение об исключении отладки, как показано в OP,
Не удалось загрузить файл или сборку ‘NationalInstruments.Обычный.Родной.dll’ или одна из ее зависимостей»
Скриншот того, что Fuslogvw.exe показывает
Программа просмотра Fuslog показывает, что все сборки были успешно загружены. Я проверил на клиентском компьютере. Хотя в файлах DLL National Instruments есть строка с надписью «Поиск GAC не удался», в то время как в других сборках этого нет.
DebugViewer отображает исключение, которое я распечатываю с помощью Debug.writeLine
. Это показывает, что NationalInstruments.Common.Native.dll
не удалось загрузить или одну из его зависимостей.
Я очень смущен.
Я попытался добавить ссылки на проект, используя декомпилятор для проверки ссылок, используя другие программы установки (кроме ClickOnce), и, похоже, ни одна из них меня никуда не привела. 🙁
Обновление 4
Я только вчера узнал, что приложение устанавливается и работает нормально в 64-разрядных системах. Два компьютера, на которых я пробовал это раньше, были 32-разрядными системами Windows 7. Я смотрю, может ли это мне как-то помочь. Приложение было скомпилировано на моем 64-разрядном ноутбуке для разработки Windows 7. Выпадающее меню «Платформа» в разделе «Сборка» в разделе «свойства проекта» показывает «Активный (x86), и у меня есть «Любой процессор» в качестве целевой платформы.
Комментарии:
1. Ну, по-видимому, на клиентском КОМПЬЮТЕРЕ отсутствуют некоторые довольно важные компоненты. Возможно, некоторые. dll или другие ресурсы.
2. Пожалуйста, перехватите и отобразите исключение, которое выдается при попадании в проблемный код. Знание исключения может дать вам ответ; публикация исключения здесь позволит лучше ответить на ваш запрос.
Ответ №1:
Потратив много времени на эту проблему, я поговорил с кем-то из National Instruments, и он помог мне решить возникшую у меня проблему. Ранее я заметил, проверяя зависимости модуля mstudiocommon.2010.msm
, что it ( mstudiocommon.2010.msm
) искал vs100_crt_x86.msm
файл, но установщик обнаружил (и добавил) a vs90_crt_x86.msm
(в «Обнаруженных зависимостях» проекта установщика). Щелчок правой кнопкой мыши по проекту установщика и добавление файла VS100 .msm вручную устранили проблему, с которой я столкнулся.
Ниже приведен скриншот зависимостей модулей, которые я мог видеть для модулей mstudiocommon
и mstudioui
слияния:
1. @antlersoft Я запустил Fusion Log Viewer на клиентском компьютере и увидел, что NationalInstruments. Обычный. Родной. dll была успешно загружена. Но все же появляется сообщение об исключении отладки, как показано в OP «Не удалось загрузить файл или сборку ‘NationalInstruments. Обычный. Родной. dll’ или одна из ее зависимостей» Вот ссылка на скриншот того, что Fuslogvw.exe показывает tinypic.com/r/2j341nq/5
Ответ №3:
Без журналов и сообщений об ошибках слишком сложно найти, что не так. Вы должны поместить a try catch
в свой код, где вы пытаетесь получить доступ к компонентам библиотеки waveformPlot
, и распечатать сообщение об ошибке и трассировку стека. После вы можете увидеть, чего не хватает.
Комментарии:
1. «Система. Исключение TypeInitializationException: Te введите инициализатор для ‘NationalInstruments.UI.Internal. WaveformPlotElement’ выдал и исключение. —> System.IO.FileNotFoundException: не удалось загрузить файл или сборку ‘NationalInstruments. Обычный. Родной. dll’ или одна из ее зависимостей. Не удалось найти указанный модуль «. —- Я проверил файлы приложения, которые находятся в папке публикации, и они содержат ‘NationalInstruments. Обычный. Native.dll «. Понятия не имею, почему он не может его загрузить.
Ответ №4:
Вы можете использовать use либо Reflector, либо JustDecompile, чтобы получить, какие ссылки ‘NationalInstruments .Обычный.Родной.потребности dll. Судя по звукам, хотя со словом Native в названии DLL это может быть оболочкой вокруг какой-то другой встроенной библиотеки DLL Win32 C. У вас они есть в той же папке? Это также может быть оболочка вокруг библиотеки DLL COM, которая, возможно, не зарегистрирована?
Ответ №5:
Я думаю, что произошло то, что кто-то установил приложение в целевой системе, которое использует только подмножество последних компонентов 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>
Ответ №6:
У меня была такая же проблема, и при наличии множества ссылок в вашем проекте очень сложно найти, какая сборка на самом деле отсутствует. Особенно, если у вас возникла эта проблема на клиентском компьютере без Visual Studio.
После часа или двух возни с fuslogvw.exe и не будучи в состоянии получить четкий ответ, я просто погуглил «обнаружение отсутствующих сборок .net application» и нашел http://www.amberfish.net /
Это работает как шарм, есть бесплатная пробная версия, и разработчик запрашивает за нее только очень демократичную цену… Очень круто!!
PS. Я НИКОИМ ОБРАЗОМ не связан с amberfish, сегодня я впервые узнал об этом инструменте. инструмент, созданный этим парнем, должен быть в наборе инструментов Windows по умолчанию. Именно то, что мне было нужно.