2010-09-20 11 views
8

Po uruchomieniu Microsoft Visual Studio, utwórz standardową "Bibliotekę usług WCF" i skompiluj ją, działa idealnie.Nie mogę skompilować standardowej "Biblioteki usługi WCF" w formacie x86

Jednakże, jeśli wejdę w Właściwości ... Buduj i ustawię "Cel platformy" na "x86", to nie zostanie skompilowane. Potrzebuję "x86", ponieważ muszę odwołać się do niektórych .dll, które po prostu nie zadziałają, jeśli wybiorę "Wszystkie platformy".

-----start error----- 
System.BadImageFormatException: Could not load file or assembly 'file:///D:\backtest\C#\WCF service\WcfServiceLibrary\bin\Debug\WcfServiceLibrary.dll' or one of its dependencies. An attempt was made to load a program with an incorrect format. 
File name: 'file:///D:\backtest\C#\WCF service for\WcfServiceLibrary\bin\Debug\WcfServiceLibrary.dll' 
    at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) 
    at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection, Boolean suppressSecurityChecks) 
    at System.Reflection.Assembly.Load(AssemblyName assemblyRef) 
    at Microsoft.Tools.SvcHost.ServiceHostHelper.LoadServiceAssembly(String svcAssemblyPath) 

=== Pre-bind state information === 
LOG: User = dr-satellite\Shane 
LOG: Where-ref bind. Location = D:\backtest\C#\WCF service for\WcfServiceLibrary\bin\Debug\WcfServiceLibrary.dll 
LOG: Appbase = file:///D:/backtest/C#/WCF service for/WcfServiceLibrary/bin/Debug 
LOG: Initial PrivatePath = NULL 
Calling assembly : (Unknown). 
=== 
LOG: This bind starts in LoadFrom load context. 
WRN: Native image will not be probed in LoadFrom context. Native image will only be probed in default load context, like with Assembly.Load(). 
LOG: Using application configuration file: D:\backtest\C#\WCF service for\WcfServiceLibrary\bin\Debug\WcfServiceLibrary.dll.config 
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config. 
LOG: Attempting download of new URL file:///D:/backtest/C#/WCF service for/WcfServiceLibrary/bin/Debug/WcfServiceLibrary.dll. 
ERR: Failed to complete setup of assembly (hr = 0x8007000b). Probing terminated. 
-----end error----- 

Odpowiedz

6

znalazłem dwa dobre sposoby, aby rozwiązać ten problem:

  1. Instalacja wersji 64-bitowej Matlab oznacza, że ​​można skompilować 64-bitowe .dll, które są kompatybilne z 64-bitową WCF usług bibliotecznych . Eliminuje to konieczność kompilowania w trybie 32-bitowym, aby nie powodował wyjątków podczas wywoływania zestawu 32-bitowego. To rozwiązanie działa dobrze.
  2. Istnieją dwa rodzaje projektów, które można wygenerować w MSVS 2010: "Biblioteka usług WCF" i "Aplikacja usługi WCF". Chociaż użytkownik nie może budować i uruchamiać "Biblioteki usług WCF" w trybie 32-bitowym (obsługuje tylko wersję 64-bitową), można zbudować i uruchomić "Aplikację usługi WCF" w trybie 32-bitowym.
+2

Masz na myśli "Usługa WCF" _Biblioteka "(ponieważ nie będzie budować w trybie 32-bitowym), ...." ??? – Steve

+0

Wierzę, że prawdziwym problemem jest to, że _Service Libraries_ (i wszystkie ich zależności) musi działać w natywnej architekturze ich hosta, która prawdopodobnie jest domyślnie twoim systemem operacyjnym. Dlatego tak, jeśli chcesz uruchomić x86 na komputerze z procesorem x64, to tak, aby aplikacja _WCF Service_ *** *** była rozwiązaniem. *** – Adam

+0

@Steve Podziękowania Poprawiony post. – Contango

12

Twoim problemem jest aktualnie klient testowy WCF narzekający, że Twoja biblioteka usług WCF ma 32-bitową. Wynika to z tego, że domyślnie klient testowy WCF zawsze działa w trybie 64-bitowym.

Zamiast przechodzić do długości zmiany na aplikację usługi WCF, aby umożliwić debugowanie, znalazłem następujące kroki na tym blog, które powodują, że klient testowy WCF działa w trybie 32-bitowym - i dlatego nie zobaczysz błędu opublikowałem.

  1. Kopiowanie WcfSvcHost.exe i WcfTestClient.exe z C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ Common7 \ IDE do lokalnego katalogu. Oczywiście zachowaj kopię zapasową tego pliku.
  2. Uruchom Visual Studio 2010 Command Prompt (jeden z linków z menu Start -> Visaul Studio 2010)
  3. "cd" do katalogu, w którym znajduje się kopia WcfSvcHost.

  4. wykonać polecenie "corflags/32bit +/force WcfSvcHost.exe"

  5. wykonać polecenie "corflags/32bit +/force WcfTestClient"

  6. skopiuj pliki z powrotem do miejsca, gdzie znalazł.

Teraz Twój WcfSvcHost i WcfTestClient będą działać w trybie 32-bitowym i możesz debugować!

+1

Miło, pracował dla mnie! –

+3

Wiem, że to stary "ish" post, ale zauważ, że to nie działa z 2012 VS11, ponieważ oba .exe są podpisane, a otrzymasz ostrzeżenie i nie pozwala ci zmienić to! – Thierry

+1

To działało dla mnie, mimo że pierwsze polecenie (krok 4) daje mi ostrzeżenie i krok 5, daje mi błąd, mówiąc, że nie można otworzyć do zapisu. – AXG1010

Powiązane problemy