Сбой приложения в 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.
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-файлах National Instruments есть строка с надписью "Поиск в GAC не выполнен", а в других сборках - нет.
DebugViewer отображает исключение, которое я распечатываю, используя Debug.writeLine
, Это показывает, что NationalInstruments.Common.Native.dll
или одна из его зависимостей не может быть загружена.
Я очень смущен.
Я попытался добавить ссылки в проект, используя декомпилятор для проверки ссылок, используя другие программы установки (кроме ClickOnce), и ни одна из них, похоже, никуда меня не привела.:(
Обновление 4
Я только вчера узнал, что приложение устанавливается и работает нормально на 64-битных системах. Два компьютера, на которых я пробовал это раньше, были 32-битными системами Windows 7. Я смотрю, может ли это помочь мне как-то. Приложение было скомпилировано на моем 64-битном ноутбуке для Windows 7. В раскрывающемся меню "Платформа" в "Сборке" в свойствах проекта отображается "Активно (x86)", а в качестве цели платформы выбрано "Любой ЦП".
6 ответов
Потратив много времени на эту проблему, я поговорил с кем-то из National Instruments, и он помог мне решить проблему, с которой я столкнулся. Я ранее заметил, проверив зависимости модуля mstudiocommon.2010.msm
, это (mstudiocommon.2010.msm
) искал vs100_crt_x86.msm
файл, но установщик обнаружил (и добавил) vs90_crt_x86.msm
(в "Обнаруженных зависимостях" проекта установщика). Правой кнопкой мыши щелкнув проект установщика и добавив MSM-файл VS100 вручную, я решил проблему, которая возникла у меня.
Ниже приведен скриншот зависимостей модуля, которые я мог видеть для mstudiocommon
а также mstudioui
модули слияния: mstudiocommon code> и
mstudioui code">
Хотя я не совсем понял, почему Visual Studio обнаруживает VS90 вместо VS100, я рад, что наконец-то исправил эту проблему, и оставлю это на другой день.
Попробуйте Fusion Log Viewer из SDK, чтобы определить, какая библиотека вызывает проблему.
Без логов и сообщений об ошибках слишком сложно найти, что не так. Вы должны положить try catch
в вашем коде, где вы пытаетесь получить доступ к компонентам библиотеки waveformPlot
и распечатайте сообщение об ошибке и трассировку стека. После вы можете увидеть, чего не хватает.
Вы можете использовать либо Reflector, либо JustDecompile, чтобы получить то, что нужно для ссылок "NationalInstruments.Common.Native.dll". Судя по звукам, хотя со словом Native в названии DLL это может быть обертка вокруг какой-то другой родной Win32 C dll. У вас есть те в той же папке? Это также может быть обертка вокруг COM DLL, которая, возможно, не зарегистрирована?
Я думаю, что случится так, что кто-то установит приложение в целевой системе, которая использует только подмножество последних компонентов 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>
У меня была та же проблема, и когда в вашем проекте было множество ссылок, очень трудно найти, какая сборка на самом деле отсутствует. Особенно, если у вас есть эта проблема на клиентском компьютере без Visual Studio.
После часа или двух возни с fuslogvw.exe и не имея возможности получить четкий ответ, я просто погуглил "обнаружение отсутствующих сборок.net application" и обнаружил http://www.amberfish.net/
Это работает как шарм, есть бесплатная пробная версия, и разработчик просит только очень демократичную цену за это... Очень круто!
PS. Я никоим образом не связан с янтарной рыбой, сегодня я впервые узнал об этом инструменте. инструмент, созданный этим парнем, должен быть в стандартном наборе инструментов Windows. Как раз то, что мне было нужно.