Kesalahan menyebarkan aplikasi ClickOnce - Referensi di manifes tidak cocok dengan identitas rakitan yang diunduh

105

Saya mencoba menerapkan aplikasi ClickOnce, tetapi penginstalan gagal pada klien. Ini log kesalahannya:

PLATFORM VERSION INFO
Windows             : 6.1.7601.65536 (Win32NT)
Common Language Runtime     : 4.0.30319.1
System.Deployment.dll       : 4.0.30319.1 (RTMRel.030319-0100)
clr.dll             : 4.0.30319.1 (RTMRel.030319-0100)
dfdll.dll           : 4.0.30319.1 (RTMRel.030319-0100)
dfshim.dll          : 4.0.31106.0 (Main.031106-0000)

SOURCES
Deployment url          : http://MyProduct.com/download/workstation/MyProduct%20Front%20Desk.application
                    Server      : Microsoft-IIS/7.5
                    X-Powered-By    : ASP.NET
Deployment Provider url     : http://MyProduct.com/Download/Workstation/MyProduct%20Front%20Desk.application
                    Server      : Microsoft-IIS/7.5
                    X-Powered-By    : ASP.NET
Application url         : http://MyProduct.com/Download/Workstation/Application%20Files/MyProduct%20Front%20Desk_1_0_0_7/MyProduct%20Front%20Desk.exe.manifest
                    Server      : Microsoft-IIS/7.5
                    X-Powered-By    : ASP.NET

IDENTITIES
Deployment Identity     : MyProduct Front Desk.application, Version=1.0.0.7, Culture=neutral, PublicKeyToken=df343a0868ab2d74, processorArchitecture=msil
Application Identity        : MyProduct Front Desk.exe, Version=1.0.0.7, Culture=neutral, PublicKeyToken=df343a0868ab2d74, processorArchitecture=msil, type=win32

APPLICATION SUMMARY
* Installable application.

ERROR SUMMARY
Below is a summary of the errors, details of these errors are listed later in the log.
* Activation of http://MyProduct.com/download/workstation/MyProduct%20Front%20Desk.application resulted in exception. Following failure messages were detected:
    + Reference in the manifest does not match the identity of the downloaded assembly MyProductSiteServer.exe.

COMPONENT STORE TRANSACTION FAILURE SUMMARY
No transaction error was detected.

WARNINGS
There were no warnings during this operation.

OPERATION PROGRESS STATUS
* [03/17/11 11:51:04] : Activation of http://MyProduct.com/download/workstation/MyProduct%20Front%20Desk.application has started.
* [03/17/11 11:51:04] : Processing of deployment manifest has successfully completed.
* [03/17/11 11:51:04] : Installation of the application has started.
* [03/17/11 11:51:05] : Processing of application manifest has successfully completed.
* [03/17/11 11:51:06] : Found compatible runtime version 4.0.30319.
* [03/17/11 11:51:06] : Request of trust and detection of platform is complete.

ERROR DETAILS
Following errors were detected during this operation.
* [03/17/11 11:51:30] System.Deployment.Application.InvalidDeploymentException (RefDefValidation)
    - Reference in the manifest does not match the identity of the downloaded assembly MyProductSiteServer.exe.
    - Source: System.Deployment
    - Stack trace:
        at System.Deployment.Application.DownloadManager.ProcessDownloadedFile(Object sender, DownloadEventArgs e)
        at System.Deployment.Application.FileDownloader.DownloadModifiedEventHandler.Invoke(Object sender, DownloadEventArgs e)
        at System.Deployment.Application.SystemNetDownloader.DownloadSingleFile(DownloadQueueItem next)
        at System.Deployment.Application.SystemNetDownloader.DownloadAllFiles()
        at System.Deployment.Application.FileDownloader.Download(SubscriptionState subState)
        at System.Deployment.Application.DownloadManager.DownloadDependencies(SubscriptionState subState, AssemblyManifest deployManifest, AssemblyManifest appManifest, Uri sourceUriBase, String targetDirectory, String group, IDownloadNotification notification, DownloadOptions options)
        at System.Deployment.Application.ApplicationActivator.DownloadApplication(SubscriptionState subState, ActivationDescription actDesc, Int64 transactionId, TempDirectory& downloadTemp)
        at System.Deployment.Application.ApplicationActivator.InstallApplication(SubscriptionState& subState, ActivationDescription actDesc)
        at System.Deployment.Application.ApplicationActivator.PerformDeploymentActivation(Uri activationUri, Boolean isShortcut, String textualSubId, String deploymentProviderUrlFromExtension, BrowserSettings browserSettings, String& errorPageUrl)
        at System.Deployment.Application.ApplicationActivator.ActivateDeploymentWorker(Object state)

COMPONENT STORE TRANSACTION DETAILS
No transaction information is available.

Exe utama yang saya perlukan untuk menyebarkan adalah MyProductFrontDesk.exe, yang memiliki ketergantungan pada MyProductSiteServer.exe- dan yang tampaknya di mana kesalahan sedang dilemparkan: "Referensi dalam manifes tidak cocok dengan identitas rakitan yang diunduh MyProductSiteServer.exe."

Manifes mana yang perlu dikoreksi? Dan bagaimana?

Shaul Behr
sumber
Apakah proyek MySiteServer.exe dalam solusi Visual Studio yang sama dengan MyProductFrontDesk.exe? Jika ya, apakah konfigurasi build Anda memiliki kedua rakitan yang dipilih untuk dibuat?
Jay
@Jay - ya, dalam solusi yang sama, keduanya dipilih untuk dibangun.
Shaul Behr

Jawaban:

111

Ada masalah dengan Visual Studio 2008 yang diselesaikan dengan tidak menyematkan manifes default - salah satu komentar di artikel tersebut menunjukkan bahwa masalah masih ada di Visual Studio 2010.

Dalam properti proyek -> tab Aplikasi -> Sumber Daya -> ikon kotak centang dan manifes , pengaturan "Sematkan manifes dengan pengaturan default" menyebabkan masalah. Menyetelnya ke "Buat aplikasi tanpa manifes" akan menyelesaikan masalah.

stuartd
sumber
Saya menemukan komentar 488301 sangat berguna: <assemblyIdentity/>elemen dalam manifes khusus dapat disesuaikan (atau dihilangkan agar kompiler memancarkan identitas perakitan yang benar) di .manifestfile khusus Anda , memungkinkan seseorang untuk menentukan hal-hal seperti <requestedExecutionLevel/>tanpa merusak ClickOnce.
binki
4
Skenario saya adalah aplikasi GUI yang membutuhkan aplikasi ke-2 yaitu aplikasi konsol. Jika seperti saya, Anda lebih suka tidak mengubah pengaturan default, menerbitkan aplikasi ke-2 secara manual membuat app.manifest yang muncul di folder Properties, lalu menerbitkan lagi aplikasi pertama bekerja tanpa harus mengubah pengaturan default untuk menyematkan manifes.
aybe
7
Memiliki masalah yang sama dengan VS 2013. Solusi ini berhasil.
EagleBeak
2
@EagleBeak di mana menu ini di VS2013? Saya tidak melihat apa-apa tentang "membuat aplikasi tanpa manifest"
Nefariis
3
Pada Juni 2016, jawaban yang benar adalah mengkonfigurasi Pengaturan Keamanan ClickOnce (lihat jawaban diposting oleh Mauro).
Pierre Arnaud
57

Saya memiliki masalah yang sama ketika saya menambahkan referensi ke proyek lain.

Cara untuk mengatasi ini adalah mengaktifkan Pengaturan Keamanan ClickOnce di semua proyek yang direferensikan seperti yang dijelaskan Ian di sini (penekanan saya):

Bagi saya, cara ini diselesaikan adalah untuk memastikan bahwa semua Proyek di bawah Solusi yang mengekspos " Tab Keamanan " di " Properti Proyek " mereka memiliki Opsi " Aktifkan Pengaturan Keamanan ClickOnce " Dicentang dengan Opsi " Ini adalah kepercayaan penuh aplikasi "Dipilih. Ini harus dilakukan dengan membuat Manifes dengan benar dan aplikasi tidak akan diinstal jika opsi ini tidak disetel pada semua Proyek dalam Solusi yang memerlukannya.

Saya yakin ini adalah cara yang tepat untuk memperbaikinya saat membuat referensi ke proyek lain dengan solusi yang sama.

Pos forum tertaut telah kedaluwarsa sekarang, tetapi tersedia di arsip di sini .

Mauro
sumber
1
Setelah mencoba begitu banyak solusi, hanya solusi ini yang berhasil untuk saya. Jadi saya juga berpikir ini harus menjadi jawaban yang diterima ...
Tareq
Anda dapat melakukan hal yang sama dengan memodifikasi .cprojfile dengan<PropertyGroup><TargetZone>LocalIntranet</TargetZone></PropertyGroup>
VMAtm
Saya telah menonaktifkan dua pengaturan itu saat saya bermain-main https://github.com/Squirrel. Ketika penerapan ClickOnce (non-produksi) saya berhenti bekerja, saya telah melupakan semua ini.
Walter Stabosz
35

Saya mengalami masalah yang sama, tetapi solusi saya sangat berbeda.

Aplikasi ClickOnce saya mereferensikan proyek file EXE lain dalam solusi saya, jadi ketika klien mengunduhnya, dan ada file EXE lain, file itu tidak memiliki manifes.

Menghapus ketergantungan pada executable lain memecahkan masalah saya.

skimania
sumber
2
Saya juga punya dua EXE. Menghapus ketergantungan akan mengecualikan EXE yang direferensikan dari build. Apakah ada cara untuk memasukkannya?
Uri Abramson
10
Ini adalah solusi untuk saya. Salah satu proyek yang direferensikan oleh EXE utama saya adalah 'Aplikasi Windows'. Ketika saya mengubah proyek itu menjadi 'Perpustakaan Kelas' dan menerbitkan ulang, semuanya berfungsi.
Chris Ray
Saya menggunakan saran @ChrisRay di VS2012, dan program diinstal tanpa kesulitan. Terima kasih!
Rolan
1
seperti yang disebutkan pengguna @Aybe di komentar jawaban lain, jika Anda mempublikasikan aplikasi kedua dummy, aplikasi tersebut akan mendapatkan manifesnya sendiri dan kemudian Anda dapat mempublikasikan aplikasi pertama dan kedua program akan bekerja sama. (Dalam kasus saya, saya memiliki dua program, yang satu memanggil yang lain.)
Dave Cousineau
Solusi bagi saya benar-benar (ini dan @stuartd) - Saya memiliki EXE sebagai rakitan referensi, yang tidak memiliki manifes. Tetapi saya tidak dapat "menghapus" referensi ini karena saya perlu menggunakannya. Jadi saya harus pergi ke proyek ketergantungan EXE ini, terapkan saran stuartd. Kemudian semuanya bekerja dengan baik.
KFL
11

Saya mengkonfirmasi bahwa masalah juga ada di Visual Studio 2010. Memilih "Buat aplikasi tanpa manifest" di Properti Proyek - Aplikasi - Sumber Daya memecahkan masalah.

Eduardo
sumber
8
Sekadar catatan bahwa saya harus mengubah properti ini pada proyek yang dikeluhkan pesan kesalahan, yang bagi saya adalah proyek yang dirujuk oleh proyek yang sebenarnya saya coba terbitkan, bukan proyek yang sebenarnya saya coba terbitkan .
deadlydog
6

Ini juga dapat terjadi jika Anda memiliki dua versi berbeda dari paket NuGet yang direferensikan dalam file DLL yang berbeda dalam proyek Anda. Dalam kasus saya, saya menggunakan kerangka kerja yang disebut Catel, dan saya memiliki versi yang lebih baru yang direferensikan dalam satu file DLL daripada yang lain (pengawasan), tetapi ini menyebabkan ClickOnce mengeluarkan kesalahan ini. Mengacu pada versi yang sama menyelesaikan masalah.

Bitfiddler
sumber
4

Saya memiliki masalah yang sama, tetapi solusi saya adalah mengubah 'Target platform' menjadi 'x86' (Project Properties -> Build Tab). Itu disetel ke Semua CPU. Segera setelah saya mengubah pengaturan dan menerbitkan ulang, penginstal ClickOnce dapat menyelesaikannya.

Paul Whygle
sumber
1
Masalah yang sangat mirip: Saya mengaktifkan "Pilih 32-bit"; mematikannya memperbaiki masalah.
Roman Starkov
4

Saya mengalami kesalahan yang sama saat menerapkan dengan proyek yang disetel ke Debug. Ketika diubah kembali ke Rilis, tidak ada kesalahan.

Dave
sumber
4

Saya memiliki masalah yang persis sama. Saya tidak dapat menghapus ketergantungan tersebut karena diperlukan oleh proyek utama. Proyek kedua adalah proyek konsol.

Saya berubah ke Perpustakaan Kelas , dan kemudian semuanya bekerja.

pengguna2971656
sumber
Komentar ini memperbaiki masalah saya. Terima kasih!
casaout
2

Solusi lain, jika dependensi exe dengan manifes aplikasi yang buruk tidak dapat diubah (katakanlah berasal dari paket NuGet). Biner dapat dimasukkan sebagai konten dengan ekstensi tiruan sehingga ClickOnce tidak mencoba memvalidasi manifes dan kemudian berganti nama saat aplikasi dimulai.

csproj:

  <Content Include="..\packages\<package>\lib\<app>.exe">
    <Link><app>.exe.bin</Link>
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </Content>
  <ItemGroup>
    <PublishFile Include="<app>">
      <Visible>False</Visible>
      <Group>
      </Group>
      <TargetPath>
      </TargetPath>
      <PublishState>Exclude</PublishState>
      <IncludeHash>True</IncludeHash>
      <FileType>Assembly</FileType>
    </PublishFile>
  </ItemGroup>

App.xaml.cs:

public partial class App : Application
{
    private void Application_Startup(object sender, StartupEventArgs e)
    {
        var appDir = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName);
        if (!File.Exists($"{appDir}\\<app>.exe"))
        {
            File.Copy($"{appDir}\\<app>.exe.bin", $"{appDir}\\<app>.exe");
        }
    }
}
Matthieu Maitre
sumber
1

Saya memiliki masalah yang sama, dan saya mencoba semua solusi yang disarankan sebelumnya di sini, dan semuanya tidak berfungsi.

Saya memperbaikinya dengan mengubah lokasi pembaruan. Dari properti proyek -> Publikasikan -> Pembaruan . Ubah lokasi pembaruan ke folder yang Anda terbitkan.

Majid Alshezawi
sumber
1

JUGA TERSEDIA UNTUK ClickOnce .exe memanggil .exe memanggil .exe.

Saya mengalami masalah ini juga, menggunakan VB.NET di Visual Studio 2010.

Saya memiliki aplikasi ClickOnce Windows Forms yang mereferensikan aplikasi Windows Forms kedua yang merujuk pada aplikasi Windows Forms ketiga. (Aplikasi kedua dan ketiga ini adalah file EXE daripada file DLL untuk kesederhanaan, karena keduanya sama-sama dapat dijalankan secara mandiri atau dipanggil dengan properti yang diteruskan kepadanya.)

Saya harus mengomentari KEDUA konten manifes aplikasi kedua dan ketiga per:

Panduan: Menerapkan Aplikasi ClickOnce Secara Manual

Ini bekerja dengan sempurna.

peter williamson
sumber
1

Jika Anda memiliki satu program utama yang mereferensikan program lain, maka Anda harus melakukan trik "Buat aplikasi tanpa manifes" pada Program program utama:

Proyek -> Properti -> Tab Aplikasi -> Sumber Daya -> Manifes -> tarik-turun "Buat aplikasi tanpa manifest"

dan kemudian beralih ke Properti Proyek program yang direferensikan dan ulangi prosesnya.

RoySeberg
sumber
0

Saya menggunakan Visual Studio 2012 di Windows 7 dan perlu menerbitkan solusi yang terdiri dari dua proyek.

Seperti yang ditunjukkan Eduardo, menandai kedua proyek sebagai ClickOnce, dan mengaktifkan Aplikasi Kepercayaan Penuh menyelesaikan masalah.

pengguna819490
sumber
0

Saya memiliki sedikit masalah lain yang dapat saya selesaikan sehingga saya ingin memposting. Masalah saya adalah saya menjalankan 3 cabang dari TFS. Saya telah meningkatkan kontrol Telerik di salah satu cabang saya tetapi tidak di yang lain. Setelah saya meningkatkan kontrol Telerik di semua 3 cabang dan menerbitkannya kembali, itu berfungsi dan kesalahan ini hilang.

Saya menggunakan VS2015 pada saat itu.

jaredbaszler.dll
sumber
0

Ini menarik. Saya baru saja menerapkan ulang aplikasi dan masalah terpecahkan. Mungkin file rusak karena jaringan.

huseyindotpw.dll
sumber
0

Saya gunakan mage.exeuntuk menghasilkan manifes saya. Menambahkan ini ke saya .csprojmemperbaiki masalah. Anda juga dapat mencoba -nowin32manifest flag compiler ; Saya belum mengujinya. Saya tidak melihat stuartd "Buat aplikasi tanpa manifest" di Visual Studio 2017; Saya pikir inilah yang dilakukannya.

<PropertyGroup>
  <NoWin32Manifest>true</NoWin32Manifest>
</PropertyGroup>

Saya juga memiliki ini di saya .csproj:

<GenerateManifests>false</GenerateManifests>
DharmaTurtle
sumber
0

Dalam versi Visual Studio 2017 saya, versi 15.6.6 (tetapi mungkin sudah ada sebelumnya) saya menemukan bahwa File Aplikasi tidak ada di Proyek Klik Kanan Exe dan Publikasikan, tetapi di bawah Tab Penerbitan Properti Proyek tempat Anda dapat mengatur yang mana File Aplikasi yang ingin Anda masukkan ke dalam instalasi.

Jadi keluarkan yang bermasalah. Jika ada sesuatu yang sudah diinstal di komputer tempat aplikasi ini akan diinstal, tidak ada alasan untuk mencoba menginstalnya kembali, kecuali jika Anda memerlukan referensi untuk menjalankannya. Jika itu untuk menginstal apa yang sudah ada di pc, tetapi ke folder yang berbeda itu mungkin tidak berfungsi. Yang terbaik adalah menggunakan aplikasi lain atau rakitan dll ke lokasi yang sama seperti yang diinstal sebelumnya.

John Foll
sumber
0

Saya mengalami masalah yang sama beberapa menit yang lalu, dan di bawah ini adalah langkah-langkah yang saya gunakan untuk menyelesaikannya.

Kunci

  • a = Proyek utama (proyek yang ingin Anda terbitkan, misalnya myProduct)
  • b = Proyek referensi (mis. MyProductSiteServer)

Daftar Periksa

  1. Arahkan ke properti -> Aplikasi -> Sumber Daya -> centang ikon dan manifes (untuk a dan b)

  2. Arahkan ke properti -> Build: pastikan a dan b berada di platform target yang sama

  3. Arahkan ke properti -> Keamanan dan pastikan bahwa a dan b memiliki pengaturan ini diperiksa: "Aktifkan pengaturan keamanan ClickOnce" dan "Ini adalah aplikasi kepercayaan penuh"

  4. Arahkan ke properti -> Publikasikan: Saya sarankan Anda mengubah jalur folder penerbitan

Kingsley Akpan
sumber
0

Saya mengalami masalah yang sama persis dengan aplikasi VS 2019 saya.

Saya telah mencoba membuat aplikasi tanpa manifes, tetapi tidak berhasil.

Namun, apa yang berhasil adalah sebagai berikut:

  1. Pergi ke Build -> Publish -> Application
  2. Klik pada tombol "Informasi Majelis"
  3. Centang opsi "Make assembly COM-Visible"

Semoga ini membantu!

LaurentiuMa
sumber