2013-05-08 5 views
5

Sto provando a impostare un progetto di applicazione MvvmCross ed eseguire test di unità su di esso (vale a dire i modelli di visualizzazione in esso). Sto usando Xamarin Studio su OS X (v. 4.0.4, più recente al momento in cui scrivo).MvvmCross assembly referenced from Cirrious.MvvmCross.dll non può essere caricato: System

L'app MvvmCross è impostata come libreria di classi portatile. Il gruppo di test è impostato come un semplice assemblaggio Mono/.Net (non PCL) che fa riferimento al framework NUnit.

Quando si tenta di eseguire i test, falliscono con un System.TypeLoadException.

Ho eseguito i test con lo Mono binding log attivo. Ecco l'output:

Mono: The following assembly referenced from /Users/jr/dev/rowinginmotion-cross/RowingInMotion.Mobile.BoatApp.Tests/bin/Debug/Cirrious.MvvmCross.dll could not be loaded: Assembly: System (assemblyref_index=3) Version: 2.0.5.0 Public Key: 7cec85d7bea7798e System error: Invalid argument

Mono: Failed to load assembly Cirrious.MvvmCross[0x559960]

Mono: Could not load file or assembly 'System, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes' or one of its dependencies.

È questa configurazione di prova non supportato =

risposta

5

Questo problema è legato al fatto che Xamarin e Mono non supportano ancora correttamente Class Libraries portatili - invece compilare e linkare contro locali assembly fissi a seconda della versione di Mono (Xamarin.Android, Xamarin.iOS, ecc.) caricata - vedere http://slodge.blogspot.co.uk/2013/01/almost-portable-binaries.html per ulteriori informazioni.

Su Windows, si sarebbe in grado di aggirare questo problema utilizzando BindingRedirect funzionalità, ma non ho ancora trovato un modo per aggirare il problema utilizzando XBuild all'interno degli ambienti di Xamarin (ad esempio, vedere il mio PCL e Mac questioni sulle http://forums.xamarin.com/discussion/3733/playing-with-pcls)

L'unico modo che posso vedere al momento di caricare questo codice in un progetto .Mac (.Net) completo consiste nell'utilizzare l'approccio consigliato Xamarin per il collegamento di file: la duplicazione dei file di progetto e la compilazione del duplicato in modo specifico rispetto all'obiettivo appropriato .

Speriamo che questo stia cambiando presto, poiché il supporto ufficiale PCL è previsto in alpha nei prossimi giorni e settimane.

1

In aggiunta alla risposta di @ Stuart (che è corretta), desidero postare una seconda soluzione che ho trovato mi consente di raggiungere lo scenario desiderato (assemblaggio PCL testabile su Mac OS e Windows).

Questa soluzione alternativa si basa su Xamarin Studio 4.0.5 (o successivo) che ha introdotto il supporto per i caratteri jolly.

In particolare, durante la compilazione su Windows, compongo il PCL e aggiungo un riferimento al progetto dal gruppo di test. Su Mac OS, compilo il 'PCL' (non c'è un vero supporto PCL in questo momento) ma lo lascio intatto dal gruppo di test. Invece, includo tutto il codice dal progetto PCL nell'assemblaggio di test, quindi ho test + codice nell'assemblaggio di test su OS X.

Ciò richiede un po 'di magia MSBuild (trucco simile utilizzato per passare i riferimenti MvvmCross tra Windows e OS Versione X). Includere questo .targets file alla parte superiore dei vostri progetti:

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <PropertyGroup Condition=" '$(OS)' == 'Windows_NT'"> 
    <MvvmCrossPlatform>VS2012</MvvmCrossPlatform> 
    <PclSupport>true</PclSupport> 
    </PropertyGroup> 
    <PropertyGroup Condition=" '$(OS)' != 'Windows_NT'"> 
    <MvvmCrossPlatform>XS-iOS-Mac</MvvmCrossPlatform> 
    <PclSupport>false</PclSupport> 
    </PropertyGroup> 
</Project> 

Poi, nel tuo unità di prova .csproj:

<ItemGroup Condition=" '$(PclSupport)' == 'false' "> 
    <Compile Include="..\RowingInMotion.Mobile.Backend\**\**.cs">  
     <Link>_Inlined\%(RecursiveDir)%(FileName)%(Extension)</Link> 
    </Compile> 
    </ItemGroup> 

    <Choose> 
    <When Condition=" '$(PclSupport)' == 'true' "> 
     <ItemGroup> 
     <ProjectReference Include="..\RowingInMotion.Mobile.Backend\RowingInMotion.Mobile.Backend.csproj"> 
      <Project>{0B448743-182C-4ADC-8E97-7F9E7EF3A03A}</Project> 
      <Name>RowingInMotion.Mobile.Backend</Name> 
     </ProjectReference> 
     </ItemGroup> 
    </When> 
    </Choose> 

Nota che ho dovuto usare il Scegliere di costruire per fare il ProjectReference condizionato, sembra che l'utilizzo di una condizione sul gruppo di articoli non consenta a Visual Studio e Xamarin Studio di caricare/ignorare il riferimento del progetto. Sembra anche che Xamarin Studio non espandi correttamente le istruzioni %(RecursiveDir)... in modo che i file mantengano i loro brutti nomi di file (non che mi interessi se sono nascosti nella loro cartella _Inlined).