VsixUtil errore VsixFeed0001: “This VSIX does not apply to any product installed on this machine. The problem could be that the VSIX manifest’s format is not recognized, or that the manifest has been corrupted.”

Avendo realizzato alcune extension per Visual Studio e volendo condividerle con gli altri sviluppatori, stavo tentando di pubblicarle tramite una Private Gallery sulla intranet aziendale. In breve, la procedura consiste nella creazione di un feed Atom contenente link alle varie extension che si vogliono pubblicare e i metadati delle stesse. Successivamente, ciascun utente può configurare all’interno della propria istanza di Visual Studio l’URL del feed Atom.

Per la creazione del feed, si può utilizzare l’utility a riga di comando VsixUtil, fornita con Visual Studio SDK. Tuttavia, nonostante le mie extension fossero create correttamente e regolarmente installate in Visual Studio, l’esecuzione di VsixUtil falliva con il seguente errore:

VSSDK: error VsixFeed0001 :  'MyExtension.vsix' - This VSIX does not apply to any product installed on this machine. The problem could be that the VSIX manifest's format is not recognized, or that the manifest has been corrupted.
VSSDK: error VsixFeed0002 : Could not create a VSIX feed file because of error '1'

Anche il workaround suggerito nelle FAQ (utilizzare l’argomento -ignoreErrors) non si è rivelato utile nel mio caso.

Se sei di fretta, puoi andare direttamente alla soluzione; altrimenti puoi continuare a leggere.

Dopo un’infruttuosa ricerca sul web, ho deciso di provare a debuggare il programma VsxUtil per carcare di capire cosa fallisse nella validazione del manifest della mia extension. Non avendo trovato il codice sorgente del SDK, ho disassemblato il programma VsixUtil.exe (installato in: C:\Program Files\Microsoft Visual Studio\2022\Professional\VSSDK\VisualStudioIntegration\Tools\Bin) con la preziosa utility ILSpy, avendo cura di caricare anche gli assembly Newtonsoft.Json.dll, Microsoft.VisualStudio.ExtensionEngineContract.dll e Microsoft.VisualStudio.ExtensionEngine.dll, presenti nella sottocartella lib. Ho quindi esportato il progetto (“File” → “Save Code…”) e l’ho aperto con Visual Studio 2022.

Dopo aver aggiunto i riferimenti ai suddetti assembly, ho riscontrato che il progetto non veniva compilato a causa ell’errore “CS0220 The operation overflows at compile time in checked mode” relativo al seguente codice in NgenData.GetHashCode():

return (int)((678645121 * -1521134295 + StringComparer.OrdinalIgnoreCase.GetHashCode(NgenApplication)) * -1521134295 + NgenArchitecture) * -1521134295 + NgenPriority;

Per tagliar corto, ho semplicemente sostituito il codice incriminato con: return base.GetHashCode();

Dopo questa modifica sono finalmente riuscito a compilare il progetto, ma all’esecuzione, nonostante avessi compilato senza ottimizzazioni e avviato in configurazione “Debug”, Visual Studio mi informava che stavo comunque cercando di eseguire una build con la configurazione “Release” e che pertanto i breakpoint non sarebbero stati efficaci.

Popup "Just My Code Warning" di Visual Studio.

Dopo alcune verifiche, ho riscontrato che il responsabile era l’attributo DebuggableAttribute, specificato nel file AssemblyInfo.cs:

[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]

Finalmente, dopo aver commentato l’attributo e ricompilato, sono riuscito ad avviare una sessione di debug.

Come sospettavo, l’errore restituito dal tool, che ho osservato essere un’eccezione Microsoft.VisualStudio.ExtensionManager.InvalidExtensionManifestException, nasconde il vero problema, che è indicato dalla inner exception:

FileNotFoundException: Could not load file or assembly 'Microsoft.VisualStudio.Validation, Version=17.6.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified
Dettagli dell'eccezione in Visual Studio

A questo punto la soluzione al problema è stata chiara: ho cercato sulla mia macchina il file Microsoft.VisualStudio.Validation.dll (trovato in varie cartelle, tra cui: C:\Program Files\Microsoft Visual Studio\2022\Professional\MSBuild\Microsoft\VisualStudio\v17.0\VSSDK) e l’ho copiato nella cartella in cui è presente VsixUtil.exe (C:\Program Files\Microsoft Visual Studio\2022\Professional\VSSDK\VisualStudioIntegration\Tools\Bin).

Se solo il messaggio di errore restituito da VsixUtil.exe fosse stato più chiaro, penso che avrei individuato il problema molto più velocemente, magari utilizzando Fusion Log. L’errore, invece, mi ha fatto pensare a un problema di validazione dell’extension, mandandomi completamente fuori strada.

TL;DR: La soluzione, in breve.

Copiare il file: Microsoft.VisualStudio.Validation.dll
da: C:\Program Files\Microsoft Visual Studio\2022\Professional\MSBuild\Microsoft\VisualStudio\v17.0\VSSDK
a: C:\Program Files\Microsoft Visual Studio\2022\Professional\VSSDK\VisualStudioIntegration\Tools\Bin.

La soluzione è semplice, ma che fatica per arrivarci! 😓

2 risposte a “VsixUtil errore VsixFeed0001: “This VSIX does not apply to any product installed on this machine. The problem could be that the VSIX manifest’s format is not recognized, or that the manifest has been corrupted.””

  1. Thanks for this post 🙁
    Unfurtunlly, copying the DLL didn’t solve the problem (at least with the community edition). Any further ideas?

    1. Hello and thank you for reading!
      I can only suggest you to try to decompile the tool using ILSpy as described in the post and run it in debug mode within Visual Studio to see which is the real exception…
      Good luck!

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.