2012-10-23 12 views
7

I PCL funzionano bene in MonoTouch e MonoDroid.Libreria portatile di classe problemi di riferimento dell'assemblaggio forte in MonoTouch/MonoDroid

Tuttavia, a volte, quando uso una variabile per fare riferimento a un tipo in un PCL, e poi cerco di utilizzare lo stesso riferimento in un client Monox, quindi il compilatore non riesce con un messaggio del tipo:

Il tipo 'System.Collections.Specialized.INotifyCollectionChanged' è definito in un assembly a cui non viene fatto riferimento. È necessario aggiungere un riferimento all'assembly 'System.Windows, Version = 2.0.5.0, Culture = neutral, PublicKeyToken = 7cec85d7bea7798e, Retargetable = Yes'.

Il problema qui è che nella mia MonoDroid System.Collections.Specialized.INotifyCollectionChanged PCL è fornita in un tipo di spessore inoltro DLL - come https://github.com/slodge/MvvmCross/tree/vnext/Cirrious/System.Windows - e, ovviamente, che la DLL non può essere firmato utilizzando la chiave privata di Microsoft.

qualche informazione in più:

  • Questo è comunemente visto per le interfacce come ICommand e INotifyCollectionChanged
  • Mi sembra che si verifichi in progetti exe (librerie in qualche modo lavorano OK)
  • Sono principalmente test/costruzione in VS2010 e VS2012
  • po 'di più: https://github.com/slodge/MvvmCross/issues/41

Can Anyo ne suggerire un modo per risolvere questo? per esempio. c'è un modo per disattivare la protezione dei nomi di assembly forte?

Penso che questo sia necessario se i PCL devono essere veramente portatili al di fuori di Microsoft implementati .Net implementazioni?

risposta

2

Da un admin VS prompt dei comandi, è possibile eseguire questo:

sn -Vr *,7cec85d7bea7798e 

Questo salterà forte di verifica nome per qualsiasi assieme con 7cec85d7bea7798e come il token di chiave pubblica. Quindi dovresti essere in grado di ritardare la firma del tuo shim DLL con quella chiave. Penso che tu possa usare sn -pc per estrarre la parte pubblica di una chiave da una DLL per usarla per la firma del ritardo.

Ciò dovrebbe consentire di compilare utilizzando gli spessori. Ovviamente, ha anche bisogno di lavorare in fase di runtime. Penso che MonoTouch e MonoDroid in realtà non convalidino le potenti chiavi dei nomi per gli assembly, quindi funzionerà. Se fanno questa convalida, allora non credo ci sia molto che tu possa fare. In tal caso, sia Mono dovrebbe apportare alcune modifiche per supportare questi riferimenti di tipo o ignorare la chiave per gli shim, oppure Microsoft dovrebbe fornire versioni firmate delle DLL shim che è possibile utilizzare.

Nota che non sono un esperto di sicurezza quindi non so quale tipo di impatto sulla sicurezza disabiliti la convalida del nome sicuro sulla tua macchina per queste chiavi Microsoft. Io non rispondo allo allo ci sarà un impatto significativo ...


dettagliato follow-up da Daniel:

Credo che questo è ciò che devi fare per ottenere intorno al tipo di condivisione/strong problemi nome di firma per le biblioteche portatili su Mono:

-> Extract la chiave pubblica di System.Windows.dll, e metterlo nella directory del progetto per il progetto Droid System.Windows:

Sn –e "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETPortable\v4.0\Profile\Profile104\System.Windows.dll" system_windows.snk 

-> Modifica progetto il Droid system.windows a del ay-sign usando la chiave estratta. Inserire il seguente in un PropertyGroup nel file csproj:

<SignAssembly>true</SignAssembly> 
<AssemblyOriginatorKeyFile>system_windows.snk</AssemblyOriginatorKeyFile> 
<DelaySign>true</DelaySign> 

-> Modificare la versione di assemblaggio del progetto Droid System.Windows (in AssemblyInfo.cs) a:

2.0.5.0 

Nel mio test, Non mi è sembrato necessario disabilitare la verifica del nome sicuro. Quindi non penso che presenterà ulteriori ostacoli per i principianti: una volta apportate queste modifiche, avranno solo bisogno di ottenere il codice e lo svilupperanno correttamente.

Tuttavia, se si esegue in problemi, provare a eseguire il seguente da un amministratore VS prompt dei comandi:

sn -Vr *,7cec85d7bea7798e 

Fammi sapere come funziona!

Grazie,

Daniel

+0

Grazie. Ho eseguito il codice in modo corretto, quindi la tua affermazione sulla mancanza di convalida del runtime sembra corretta. Dovrò elaborare attentamente i passaggi della tua risposta per comprenderli. Non ho mai fatto alcuna firma di codice, quindi molte delle tue istruzioni suonano come una lingua straniera per me :) Torneranno con più feedback dopo che avrò lavorato qualcosa. – Stuart

-1

ho problema simile nel mio progetto in cui ho PCL per .Net 4.5, Windows Phone 8, WinRT, MonoTouch e MonoDroid, quando provo a costruire progetti MonoDroid o MonoTouch gli errori sono i seguenti:

* Errore 1 Il tipo 'System.Object' è definito in un assembly a cui non è fatto riferimento. È necessario aggiungere un riferimento all'assembly 'System.Runtime, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a'.

Errore 2 Il tipo "System.Enum" è definito in un assembly non di riferimento. È necessario aggiungere un riferimento all'assembly 'System.Runtime, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a'.

Ho eseguito il comando suggerito (sn -Vr *, b03f5f7f11d50a3a), ma non è stato d'aiuto. Sto usando il seguente profilo:

C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETPortable\v4.5\Profile\Profile78 
+0

Devi chiederlo come una nuova domanda che fa riferimento a questo in realtà. Qualcuno potrebbe essere in grado di aiutarti (@dsplaisted alla fine mi ha aiutato!) – Stuart

Problemi correlati