Domanda

Scenario: ho un progetto che comprende due progetti C #, che per motivi storici devono comunicare tra loro tramite COM (tramite interoperabilità COM). Il server COM è un oggetto di automazione in-process (chiamalo "Server") e il client COM è una semplice applicazione console C # che carica il server in questo modo:

        var objTypee = Type.GetTypeFromProgID("ProgID.Interop3264");
        var objLateBound = Activator.CreateInstance(objType);

Visual Studio registra automaticamente gli assembly per COM Interop se tale opzione è abilitata nelle impostazioni del progetto, quindi è quello che uso per registrare il Server (sono interessato solo all'esperienza degli sviluppatori qui, l'installazione è un problema separato) e tutto funziona bene finché i progetti sono impostati per generare codice a 32 bit o il client COM è a 32 bit.

Il problema si presenta quando si sviluppa su un sistema a 64 bit ed entrambi i progetti sono impostati in modo da generare il codice per "Qualsiasi CPU" che si traduce in un funzionamento in modalità a 64 bit. Questo produce il seguente errore:

"Retrieving the COM class factory for component with CLSID {6F597EDF-9CC8-4D81-B42E-1EA9B983AB02} failed due to the following error: 80040154."

Dopo alcune indagini, sembra che gli script di MSBuild eseguano solo la registrazione a 32 bit. Inserisce ProgID nella sezione del registro a 64 bit, insieme alla sua sottochiave CLSID e al classID corretto. Ma il materiale CLSID {clsid} non è presente. È solo nella sottostruttura WOW6432, per 32 bit. Quindi l'attivatore non può recuperare la factory di classe perché non riesce a trovare la cosa.

Sarò davvero colpito dalla comunità SO se avrò una risposta a questa, ma qui va:

Qualcun altro ha riscontrato questo problema? come l'hai risolto? Qual è il modo più semplice per garantire che gli assembly di interoperabilità COM vengano correttamente registrati su macchine di sviluppo a 64 bit?

È stato utile?

Soluzione

Abbiamo riscontrato questo problema e risolto impostando progetti per generare assembly per x86. Questo non è ottimale, ovviamente, ma abbiamo anche diverse librerie native a 32 bit, quindi abbiamo dovuto farlo comunque.

Altri suggerimenti

Sono stato in grado di risolverlo con il seguente elemento KB. Fondamentalmente ho disattivato la registrazione per l'interoperabilità COM nelle impostazioni di compilazione del progetto e ho usato il comando post-build:

"%Windir%\Microsoft.NET\Framework64\v2.0.50727\regasm" "$(TargetPath)" 

http://support.microsoft.com/kb/956933

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top