2013-05-08 10 views
5

Próbuję skonfigurować projekt aplikacji MvvmCross i uruchomić testy jednostkowe przeciwko niemu (czyli modele widoku w nim). Używam Xamarin Studio na OS X (wersja 4.0.4, najnowsza w momencie pisania).Nie można załadować zestawu MvvmCross, do którego odwołuje się Cirrious.MvvmCross.dll: System

Aplikacja MvvmCross jest skonfigurowana jako przenośna biblioteka klas. Zestaw testowy jest skonfigurowany jako zwykły zespół Mono/.Net (nie PCL) odwołujący się do struktury NUnit.

Podczas próby wykonania, zawodzą z System.TypeLoadException.

Uruchomiłem testy z Mono binding log na. Oto wynik:

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.

Czy ta konfiguracja testowa nie obsługiwane =

Odpowiedz

5

Ten problem jest związany z faktem, że Xamarin i Mono jeszcze nie prawidłowo obsługiwać przenośne bibliotek klas - zamiast je skompilować i łącze przeciwko lokalnym naprawiono złożenia w zależności od wersji Mono (Xamarin.Android, Xamarin.iOS, itp.), którą załadowałeś - zobacz http://slodge.blogspot.co.uk/2013/01/almost-portable-binaries.html, aby uzyskać więcej informacji.

W systemie Windows będzie można obejść ten problem używając BindingRedirect funkcjonalność, ale jeszcze nie znalazła żadnego sposobu, aby ominąć ten problem używając XBuild w środowiskach Xamarin (np patrz kwestii mojego PCL i Mac na http://forums.xamarin.com/discussion/3733/playing-with-pcls)

Jedyny sposób, w jaki widzę, że aktualnie ładuję ten kod w pełnym projekcie .Mac (.Net) to użycie zalecanego przez Xamarin podejścia do łączenia plików - duplikowanie plików projektu i kompilowanie duplikatu specjalnie pod kątem odpowiedniego celu .

Mam nadzieję, że to się wkrótce zmieni - oficjalna obsługa języka PCL ma się pojawić w alfa w najbliższych dniach i tygodniach.

1

Oprócz odpowiedzi @ Stuarta (co jest poprawne), chcę opublikować drugie obejście problemu, które znalazłem, pozwala mi osiągnąć mój pożądany scenariusz (zespół PCL testowalny na Mac OS i Windows).

To obejście opiera się na Xamarin Studio 4.0.5 (lub nowszym), w którym wprowadzono obsługę symboli wieloznacznych.

W szczególności podczas kompilacji w systemie Windows kompiluję PCL i dodaje do niego odniesienie do projektu z zespołu testowego. W systemie Mac OS kompiluję "PCL" (teraz nie ma prawdziwego wsparcia PCL), ale pozostawiam to nietknięte z zestawu testowego. Zamiast tego, wieloznacznik obejmuje cały kod z projektu PCL do zestawu testowego, więc mam kod test + w zespole testowym na OS X.

Wymaga to trochę magii MSBuild (podobna sztuczka używana do przełączania odniesień MvvmCross między Windows i OS Wersja X). Uwzględnienie tego .targets plik na szczycie swoich projektów:

<?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> 

Następnie w jednostce testowej .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> 

pamiętać, że musiałem użyć Wybierz skonstruować, aby ProjectReference warunkowa, to wydaje się, że użycie warunku w grupie pozycji nie powoduje, że Visual Studio i Xamarin Studio ładują/ignorują odniesienie do projektu. Wydaje się również, że Xamarin Studio nie rozszerza prawidłowo instrukcji %(RecursiveDir)..., więc pliki zachowują swoje nieprzyjemne nazwy plików (nie, żebym się tym przejmował, o ile są ukryte w folderze _Inlined).