2015-12-22 14 views
16

Ho un PCL xamarin che funziona bene in modalità debug x86. Quando lo cambio in Release Mode (x86 o x64) o x64 Debug, ottengo eccezioni di runtime. Probabilmente si riferisce aPerché il mio Xamarin PCL genera un'eccezione di runtime quando si crea la versione per Universal App?

https://forums.xamarin.com/discussion/57810/issue-with-xamarin-forms-in-windows-uwp-app-compiled-in-the-release-mode

ma io non so cosa altro gruppo che sto usando. Come posso dire?

Il mio computer è x64. Quando eseguo x64 sia in debug che in release ottengo

Eccezione "System.NotImplementedException" in MyApp.Interop.dll. Informazioni aggiuntive Arg_NotImplementedException.

Prima di immettere l'app costruttore(). La chiamata al costruttore è qui:

LoadApplication(new MyApp.App()); 

Quando costruisco x86 ottengo un po 'di più. Si entra nel MyAppConstructor e chiama il costruttore XAML e dà eccezione:

System.Reflection.MissingMetadataException in System.Private.Reflection.Core.dll AdditionalInfo: Arg_InvokeMethodMissingMetadata, System.EventHandler. Per ulteriori informazioni, visitare http://go.microsoft.com/fwlink/?LinkId=623485

Quindi sembra un assembly Xaml che mi manca. Come posso scoprire quale assembly devo aggiungere?

ho messo di nuovo su di debug, ma rivolto a "usare il nativo del compilatore" così ho potuto avere maggiori dettagli sulle eccezioni:

x86: Ulteriori informazioni: Impossibile creare un delegato del tipo 'sistema. EventHandler 'in quanto manca metadati per il metodo Invoke. Per ulteriori informazioni, si prega di visitare il sito http://go.microsoft.com/fwlink/?LinkID=616867

x64: Un'eccezione di tipo 'System.NotImplementedException' si è verificato in Xamarin.Forms.Platform.UAP.dll ma non è stata gestita nel codice utente

Ulteriori informazioni: Il metodo o l'operazione non è implementata.

UPDATE: Sto supponendo che x64 non sia supportato in Xamarin perché nessun prodotto mobile ha un processore x64? Lascia ancora il problema con la versione x86. Ho provato ad aggiungere i seguenti gruppi nel mio universale App.xaml.cs

List<Assembly> assembliesToInclude = new List<Assembly>(); 
    assembliesToInclude.Add(typeof(MyApp.MyAppMainPage).GetTypeInfo().Assembly); 
    assembliesToInclude.Add(typeof(Xamarin.Forms.ImageSource).GetTypeInfo().Assembly); 
    assembliesToInclude.Add(typeof(Xamarin.Forms.StackLayout).GetTypeInfo().Assembly); 
    assembliesToInclude.Add(typeof(Xamarin.Forms.Label).GetTypeInfo().Assembly); 
    assembliesToInclude.Add(typeof(Xamarin.Forms.Button).GetTypeInfo().Assembly); 
    assembliesToInclude.Add(typeof(Xamarin.Forms.FormattedString).GetTypeInfo().Assembly); 
    assembliesToInclude.Add(typeof(Xamarin.Forms.Span).GetTypeInfo().Assembly); 
    assembliesToInclude.Add(typeof(Xamarin.Forms.Image).GetTypeInfo().Assembly); 
    assembliesToInclude.Add(typeof(Xamarin.Forms.ScrollView).GetTypeInfo().Assembly); 
    assembliesToInclude.Add(typeof(Xamarin.Forms.WebView).GetTypeInfo().Assembly); 
    // add this line 
    Xamarin.Forms.Forms.Init(e,assembliesToInclude); // requires the `e` parameter 

dove MyAppMainPage è la pagina xaml provo a caricare nel mio PCL e il resto sono gli elementi dell'interfaccia utente che la pagina è costituito da .

ora vedo questa eccezione generata per x86:

'System.PlatformNotSupportedException' in System.Private.Interop.dll Eccezione generata: 'System.AggregateException' in System.Private.Threading.dll eccezione generata : 'System.Reflection.MissingMetadataException' in System.Private.Reflection.Core.dll

Perché la piattaforma non è supportata? Xamarin supporta Universal giusto?

+1

Sembra che tu stia provando tutte le cose giuste, ovviamente hai pulito e cancellato tutti i file nella cartella bin? C'è qualche indizio alzando la verbosità del log di costruzione e confrontando debug vs release –

+0

@JeremyThompson Come posso aumentare la verbosità del log di costruzione? –

+1

In Visual Studio andare su Strumenti-> Opzioni, quindi individuare il nodo Progetto e soluzioni-> Costruisci ed esegui. –

risposta

9

Ho aggiunto un file di direttive. Aggiungi un file con estensione .rd.xml. Il mio era MyApp.rd.xml.Quindi includi i tipi che l'eccezione dice mancano. Il mio era System.EventHandler. Ecco il mio codice (probabilmente non hai bisogno degli altri due).

<?xml version="1.0" encoding="utf-8"?> 
<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata"> 
<Application> 
    <Type Name="MyApp.MyAppMainPage" Dynamic="Required All" /> 
    <Type Name="System.EventHandler" Dynamic="Required All" /> 
    <Namespace Name="System.Private.Reflection.Core" Serialize="Required All" /> 
</Application> 
</Directives> 

Immagino che in Universal Apps per Xamarin sia necessario includere l'assembly durante il caricamento delle risorse incorporate. Ho dovuto cambiare

ImageSource.FromResource("MyApp.Images.Sign.jpg"); 

a

var assembly = typeof(MyAppMainPage).GetTypeInfo().Assembly; 
ImageSource.FromResource("MyApp.Images.Sign.jpg",assembly); 

È possibile controllare quali risorse avete da

foreach (var res in assembly.GetManifestResourceNames()) 
    System.Diagnostics.Debug.WriteLine("found resource: " + res); 

x64 ancora rotto.

+0

Lavoro su .NET per UWP. Questo è super interessante e mi piacerebbe dare un'occhiata più approfondita dopo le vacanze. Se desideri, puoi scrivermi a [email protected] –

+0

Grazie a @MattWhilden ti ho inviato un'email. Buone vacanze! –

+0

@SethKitchen, grazie! Il tuo metodo ha funzionato per me. Ma la mia app si blocca attualmente al momento del caricamento dei metadati per Xamarin.Forms.OnPlatform , come risolverlo? Ho provato ad aggiungere questo tipo alle direttive runtime, ma non aiuta. – pfedotovsky

Problemi correlati