2016-05-19 4 views
0

Ich habe eine Desktop-App, die ein Stück Hardware von Drittanbietern mit ihrer bereitgestellten .dll steuert (Ich bin relativ zuversichtlich, dass dies eine 64-Bit-DLL ist, da es ist läuft gut in VS2015 kompiliert mit entweder AnyCPU oder x64). Bei Verwendung als Desktop-App funktioniert alles wie erwartet.C# DLL funktioniert gut lokal, aber nicht als WCF-Dienst

Ich versuche nun, dieselben Befehle wie einen WCF-Dienst bereitzustellen, damit eine Clientanwendung die Hardware remote steuern kann. Wenn der Client eine Verbindung erhalte ich:

An exception of type 'System.BadImageFormatException' occurred in mscorlib.dll but was not handled in user code

Additional information: Retrieving the COM class factory for component with CLSID {58DB561E-0186-11D5-BBB6-00508B35B332} failed due to the following error: 800700c1 is not a valid Win32 application. (Exception from HRESULT: 0x800700C1).

If there is a handler for this exception, the program may be safely continued.

ich auf die gleiche DLL wie die Desktop-App bin Referenzierung und die gleichen Funktionen aufrufen. Der Client ist auch eine 64-Bit-Anwendung (die derzeit noch auf demselben Rechner läuft). Die Kommunikation zwischen dem Client-Service kann bereits mit einer einfachen Hello World-Funktion verifiziert werden.

Was fehlt mir? Warum funktioniert die .dll in einem Fall reibungslos und nicht anders?

Edit: Ich kann die Client-Anwendung aus dieser auszuschließen, da ich den Fehler auslösen invoke in der WCF Test Client-Anwendung, die von VS2015 startet. Dies ist definitiv etwas falsch mit der Service-Anwendung. Außerdem kann ich es für 32bit oder für 64bit kompilieren und beide geben die System.BadImageFormatException.

+0

Wie hosten Sie den Service? IIS? Wenn dies der Fall ist, überprüfen Sie, ob im Anwendungspool die Option "32-Bit-Anwendungen aktivieren" auf "false" gesetzt ist. – lesscode

+0

Ich glaube nicht, dass ich das bin ... Das heißt, ich bin neu bei C# und WCF-Diensten im Allgemeinen. Ich benutze das 'System.ServiceModel' und es scheint nur mit dem Debugger auf localhost für HTTP-Zugriff vom Client gehostet werden. Außerdem glaube ich nicht, dass die .dll der Dienst oder der Client 32bit sind - ich denke seine 64bit auf der ganzen Linie. – sam

+0

Verwenden Sie eine DLL eines Drittanbieters? Wenn ja, überprüfe die Bissigkeit. Es ist wahrscheinlich 32-Bit. Alle DLLs müssen 64-Bit sein, auch die, auf die Sie in Ihrem Projekt verweisen. – Frode

Antwort

0

Nun, für alle anderen, die sich hier in dieser Situation finden kann ist, wie es stellte sich heraus, zu haben scheint:

Die Drittanbieter-DLL 32 in beiden kam und eine 64-Bit-Version. Ich lief regsvr.exe auf einer Version, aber nicht auf der anderen (zu diesem Zeitpunkt bin ich mir nicht sicher, welches war was). Sie sind gleich benannt, befinden sich jedoch in verschiedenen Verzeichnissen und scheinen etwas verwirrend zu sein. Sie würden mir erlauben, auf die .dll-Datei zu verweisen, aber beim Aufruf abstürzen.

Rätsel gelöst - es sind immer die kleinen Details.