2009-10-21 8 views
1

Un peu d'une question étrange et probablement en arrière de ce que la plupart des gens veulent faire, mais j'essaie de contourner un problème COM hérité.Charger un assembly .NET à partir d'un COM ProgID sans créer d'objet COM

J'ai deux composants, qui sont tous deux des assemblages .NET, mais pour des raisons historiques, l'un charge l'autre en tant qu'objet COM (l'assembly est enregistré pour COM Interop). C'est une architecture de plug-in où le plug-in est identifié par son COM ProgID, c'est donc la seule information que je reçois pour charger l'assemblage du plug-in.

Une technique que j'ai essayé est:

var objType = Type.GetTypeFromProgID("My.ProgId"); 
var objLateBound = Activator.CreateInstance(objType); 
IMyInterface netAssembly; 
try 
    { 
    netAssembly = (IMyAssembly)objLateBound; 
    } 
catch (Exception) 
    { 
    netAssembly = null; 
    } 

Si la distribution à une interface .NET réussit, je sais que je l'ai un ensemble de .NET et peut y accéder via l'interface. Cependant, la technique est un peu maladroite et j'ai des problèmes avec le côté COM, surtout sur les systèmes 64 bits. Je préférerais simplement éliminer le chargement de l'objet COM et charger le plug-in directement en tant qu'ensemble .NET, si possible.

Mais la seule information que je dois faire est le COM ProgID du plug-in.

Alors, comment puis-je passer d'un ProgID COM au chargement d'un assemblage .NET, sans créer d'objets COM?

Répondre

3

Recherchez dans le registre la DLL associée au ProgID que vous avez. Une fois que vous avez son chemin complet, load comme un assembly .NET normal:

var type = Type.GetTypeFromProgID("My.ProgId", true); 
var regPath = string.Format(@"{0}\CLSID\{1:B}\InProcServer32", 
    Registry.ClassesRoot, type.GUID); 
var assemblyPath = Registry.GetValue(regPath, "", null); 
if (!string.IsNullOrEmpty(assemblyPath)) 
{ 
    var assembly = Assembly.LoadFrom(assemblyPath); 
    // Use it as a normal .NET assembly 
} 
+0

Ah, à droite. On dirait que j'ai peut-être trop réfléchi au problème. Je pensais que peut-être il y avait un moyen de le faire à partir du type plutôt que de ramper le registre, mais votre exemple le rend plutôt simple. Merci pour l'extrait de code, qui rend ma vie beaucoup plus facile, merci d'avoir pris le temps de le faire. –