Domanda

Come posso sapere dal nome dell'assembly, o dalla classe assembly (o altri simili), se un assembly fa parte del file .NETTO quadro (cioè System.windows.Forms)?

Finora ho considerato le proprietà PublicKeyToken e CodeBase, ma queste non sono sempre le stesse per l'intero framework.

Il motivo per cui desidero queste informazioni è ottenere un elenco di assembly utilizzati dal mio file EXE che devono trovarsi sui computer client, in modo da poter comprimere i file corretti in un file di installazione senza utilizzare il sistema di installazione di Visual Studio.Il problema è che non voglio raccogliere alcun assembly .NET Framework e voglio che sia un processo automatico facile da implementare ogni volta che viene completato un aggiornamento importante.

La soluzione definitiva sarebbe che esista una proprietà IsFramework...:)

È stato utile?

Soluzione

Sospetto che il metodo più affidabile e più generale sarà PublicKeyToken.Sì, ce n'è più di uno, ma sarà un elenco finito e che non cambierà molto spesso.

Del resto, potresti semplicemente avere una lista bianca di nomi di assembly: anche quella lista sarà sia finita che statica tra le versioni del framework.

Altri suggerimenti

A tale scopo, utilizzo il nome del prodotto incorporato nell'assembly tramite AssemblyProductAttribute.

var attribute = assembly.GetCustomAttributes(typeof(AssemblyProductAttribute), false)[0] as AssemblyProductAttribute;
var isFrameworkAssembly = (attribute.Product == "Microsoft® .NET Framework");

Sto utilizzando questa tecnica per raggruppare gli assiemi per prodotto nella schermata Informazioni dell'applicazione e sembra che funzioni perfettamente per me.

Ho dovuto affrontare lo stesso identico problema.Sfortunatamente, tutte le risposte fornite finora lo sono insufficiente per determinare in modo sicuro se un assembly fa parte di .NET Framework.

Microsoft inserisce una classe denominata FXAssembly nello spazio dei nomi globale di ogni assembly del framework con una stringa const che indica la versione:

.class private abstract auto ansi sealed beforefieldinit FXAssembly
    extends [mscorlib]System.Object
{
    .field assembly static literal string Version = string('2.0.0.0')

}

Utilizzare questo "marcatore" per verificare se un assieme è un assieme di framework.Anche controllare la chiave pubblica non farà male.

No, non inizia con "Sistema".Potresti controllare "WindowsBase" che è un assembly del framework.

Non è possibile controllare anche PublicKeyToken, perché esistono altri assembly Microsoft firmati con le chiavi "predefinite", ma non fanno parte di .NET Framework (assembly Visual Studio).

Il modo migliore per farlo è ottenere una raccolta di framework .NET installati e verificare se l'assembly di destinazione fa parte del loro RedistList (RedistList\FrameworkList.xml).

FrameworkList.xml può essere trovato in:

  • .NET 2.0:C:\Windows\Microsoft.NET\Framework64\v2.0.50727 edistList
  • .NET 3.x:C:\Programmi (x86) eference Assemblies\Microsoft\Framework\vNumero della versione edistList
  • .NET 4.x:C:\Programmi (x86) eference Assemblies\Microsoft\Framework.NETFramework\vNumero della versione edistList
  • .NET Core:C:\Programmi (x86) eference Assemblies\Microsoft\Framework.NETCore\vNumero della versione edistList

Se sai che nessuna delle tue DLL sarà nel GAC, puoi controllare se ciascun assembly è nel GAC o meno.Se lo è, non copiarlo.Se non lo è, copialo.Esiste una proprietà nella classe Assembly chiamata GlobalAssemblyCache.Questo ovviamente funzionerebbe meglio in alcune situazioni che in altre.

Quando installi Visual Studio, ottieni gli assembly di riferimento in varie sottocartelle del modulo C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\{FrameworkName}\{FrameworkVersion} - la cosa più interessante potrebbe essere la RedistList\FrameworkList.xml file che contiene un elenco di tutti i nomi di assembly forniti con la versione del framework specificata.

Per esempio. C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\RedistList\FrameworkList.xml sembra contenere un elenco di tutti gli assembly Framework di .NET 4.0.

È possibile utilizzare facilmente questi file per stabilire liste bianche statiche di assembly.

È possibile utilizzare la riflessione per esaminare l'editore dell'assembly e coordinarlo con il percorso dell'assembly.Se trovi un assembly il cui editore è Microsoft e che esiste da qualche parte di seguito C:\Windows\Microsoft.NET\Framework è una scommessa sicura che fa parte del runtime.

A pensarci bene, l’editore potrebbe anche non essere necessario.Tutto ciò che si trova in quel percorso dovrebbe far parte del runtime (esclusa un'applicazione che si comporta in modo anomalo e che si muove dove non dovrebbe essere).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top