2016-08-04 13 views
6

У меня есть приложение C#, работающее на .NET Framework 4.5, развернутое через Microsoft ClickOnce. Я также использую небольшую утилиту из Microsoft SDK под названием DComPerm.exe, которая является приложением на C++, которое мне пришлось составлять отдельно. Мое основное приложение использует Process.Start() для доступа к этому исполняемому файлу.Как я могу связать VC++ 2015, распространяемую с моим приложением ClickOnce (.NET)?

Когда я впервые попробовал запустить это на клиентской машине, у меня появилось сообщение об ошибке, указывающее на отсутствие VCRUNTIME140.dll, когда приложение пыталось вызвать DComPerm.exe.

VCRUNTIME140.dll missing

Это имеет смысл ... так как эта программа была составлена ​​в C++ он нуждается в Visual C++ 2015 распространяемый пакет, который не был установлен на клиентском компьютере. Я хочу сделать это максимально безболезненным, поэтому я надеялся, что смогу связать VC++ 2015 Redist с моим приложением ClickOnce. В разделе «Свойства проекта»> «Опубликовать вкладку» есть кнопка «Предварительные требования», которая позволяет мне указать, что приложение должно связывать распространяемый пакет.

Prerequisites on Publish tab

Это великолепно звучит в теории, но она не работает. Теперь, когда я пытаюсь установить приложение 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 теги я могу использовать, чтобы указать местоположение явно? Или как еще я могу это исправить? Как я могу расслоить распространяемое без нарушения моего приложения?

+3

'поскольку эта программа была скомпилирована в C++, ей необходим распространяемый пакет Visual C++ 2015 'Только при ссылке на DLL-библиотеки CRT. Почему бы не связать ЭЛТ статически, вместо этого ('/ MT', см. [Функции библиотеки CRT] (https://msdn.microsoft.com/en-us/library/abx4dbyh.aspx))? – dxiv

+0

@dxiv то, что вы здесь говорите, кажется многообещающим, но я этого не понимаю. Вы говорите, что можно по существу построить DLL в самом исполняемом файле, тем самым отрицая необходимость в отдельном перераспределяемом? – SoaperGEM

+0

При включенной 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

ответ

4

У меня была почти такая же проблема. Вы спросили, как указать местоположение загрузки, которое разрешает ClickOnce.Для того, чтобы сделать это, откройте

C:\Program Files (x86)\Microsoft Visual Studio 14.0\SDK\Bootstrapper\Packages\vcredist_x86\en\package.xml 

и редактировать атрибут с Name="https://go.microsoft.com/fwlink/..." на правильный URL. Кстати, спасибо за то, что вы нашли правильную ссылку для загрузки, я не смог ее найти, пока не увидел этот пост.

VC++ Redis установлен правильно на компьютере клиента после этого.

+1

Спасибо за помощь! И только для справки, вот ссылка на [x64 version] (https://go.microsoft.com/fwlink/?LinkId=615460). – SoaperGEM