2009-11-25 7 views
1

Je crée une DLL "Plugin" pour un EXE. Le fichier EXE appelle une fonction dans la DLL avec un objet en tant que paramètre et part de là.Accès à la mémoire protégée en C# via COM interop

Tout fonctionne bien et dandy jusqu'à ce que je le divise en un nouveau fil. Cette erreur se produit

Tentative de lecture ou d'écriture de la mémoire protégée . C'est souvent une indication que l'autre mémoire est corrompue.

lors de l'exécution de ce code sur l'objet dans le nouveau thread:

protected object GetPropertyValue(object obj, string PropertyName) 
    { 
     return obj.GetType().InvokeMember(PropertyName, BindingFlags.GetProperty, null, obj, new object[] { }); 
    } 

ci-dessus tente d'accéder à une propriété sur un objet COM. Changer la fonction en 'public' ne l'affecte pas. Le code fonctionne très bien mais si je n'utilise qu'un seul thread.

Ce qui se passe est clair: Le nouveau thread n'a pas accès à la variable dans le fichier EXE. Comment puis-je réparer cela? Ne pas utiliser un thread n'est pas une option viable.

apprécierais toute aide

Répondre

4

Votre objet COM existe probablement dans la STA. Cela signifie que vous devez renvoyer au thread qui possède l'objet et effectuer l'appel à partir de là.

Si l'objet COM prend en charge le thread libre, il est peut-être en cours d'exécution dans la STA car votre méthode principale est marquée avec l'attribut de thread STA. En outre, si vous contrôlez l'objet COM, vous pouvez essayer de le transformer en objet MTA.

Dans ce cas, essayez de supprimer cet attribut. Toutefois, si vous utilisez des formulaires Windows, vos formulaires doivent être créés à partir d'un thread STA.

+0

Je n'ai aucun contrôle sur l'objet COM – Lynxy

+0

Mais vous avez le contrôle sur le thread qui l'appelle. S'il s'agit d'un objet com STA, vous devez y accéder depuis le thread qui le possède (le thread où il a été créé). –

+0

Vous pouvez également ajouter la définition du thread BG pour utiliser le STA lorsque vous le créez. Si vous faites cela, je crois que le CLR gérera la distribution de thread pour vous (en utilisant la boucle de message). Pour cela appelez thread.SetAppartmemtState –

Questions connexes