У меня есть приложение C#, работающее на .NET Framework 4.5, развернутое через Microsoft ClickOnce. Я также использую небольшую утилиту из Microsoft SDK под названием DComPerm.exe, которая является приложением на C++, которое мне пришлось составлять отдельно. Мое основное приложение использует Process.Start()
для доступа к этому исполняемому файлу.Как я могу связать VC++ 2015, распространяемую с моим приложением ClickOnce (.NET)?
Когда я впервые попробовал запустить это на клиентской машине, у меня появилось сообщение об ошибке, указывающее на отсутствие VCRUNTIME140.dll, когда приложение пыталось вызвать DComPerm.exe.
Это имеет смысл ... так как эта программа была составлена в C++ он нуждается в Visual C++ 2015 распространяемый пакет, который не был установлен на клиентском компьютере. Я хочу сделать это максимально безболезненным, поэтому я надеялся, что смогу связать VC++ 2015 Redist с моим приложением ClickOnce. В разделе «Свойства проекта»> «Опубликовать вкладку» есть кнопка «Предварительные требования», которая позволяет мне указать, что приложение должно связывать распространяемый пакет.
Это великолепно звучит в теории, но она не работает. Теперь, когда я пытаюсь установить приложение ClickOnce на клиентской машине, оно не работает. Установка терпит неудачу, и указывает мне в лог-файл, который содержит следующую соответствующую информацию:
'Visual C++ "14" Runtime Libraries (x86)' RunCheck результат: Установить НЕОБХОДИМЫ
Установка компонентов «Visual C++ "14" Runtime Libraries (x86) ".
Копирование файлов во временную папку "C: \ Users \ Владелец \ AppData \ Local \ Temp \ VSD3872.tmp \"
Загрузка файлов в «C: \ Users \ Владелец \ AppData \ Local \ Temp \ VSD3872 .tmp \»
(8/4/2016 12:57:48 PM) Загрузка 'vcredist_x86 \ vcredist_x86.exe' от 'http://go.microsoft.com/fwlink/?LinkID=800028&clcid=0x409' в«C: \ Users \ Владелец \ AppData \ Local \ Temp \ VSD3872. TMP \»
Загрузка завершена в 8/4/2016 12:57:49 PM
Downloading неудачу с HRESULT = -2146697208
И это сообщение делает это довольно ясно, что проблема заключается в: the link, что он пытается использовать для загрузки пакета Redist мертв. Только ... Я не уверен, как я могу сказать, чтобы найти правильную ссылку. Я очень удивлен, что он не может найти его автоматически, поскольку это похоже на ошибку с Visual Studio. Некоторые поиски показали, что правильная ссылка на самом деле this one, но это не то, что разрешает ClickOnce. Я также видел, что, установив флажок это соответствующее обновление XML в моем файле csproj:
<BootstrapperPackage Include="Microsoft.Visual.C++.14.0.x86">
<Visible>False</Visible>
<ProductName>Visual C++ "14" Runtime Libraries %28x86%29</ProductName>
<Install>true</Install>
</BootstrapperPackage>
Есть некоторые XML теги я могу использовать, чтобы указать местоположение явно? Или как еще я могу это исправить? Как я могу расслоить распространяемое без нарушения моего приложения?
'поскольку эта программа была скомпилирована в C++, ей необходим распространяемый пакет Visual C++ 2015 'Только при ссылке на DLL-библиотеки CRT. Почему бы не связать ЭЛТ статически, вместо этого ('/ MT', см. [Функции библиотеки CRT] (https://msdn.microsoft.com/en-us/library/abx4dbyh.aspx))? – dxiv
@dxiv то, что вы здесь говорите, кажется многообещающим, но я этого не понимаю. Вы говорите, что можно по существу построить DLL в самом исполняемом файле, тем самым отрицая необходимость в отдельном перераспределяемом? – SoaperGEM
При включенной CRT программе программа не будет зависеть от DLL 'VCRUNTIME'. См. Например [Как сделать полностью статически связанную .exe с Visual Studio Express 2005?] (Http://stackoverflow.com/questions/37398/how-do-i-make-a-fully-statically-linked- exe-with-visual-studio-express-2005) (он работает одинаково для VS 2015). – dxiv