Aquí está el problema central: Tengo una aplicación .NET que está usando COM interop en un dominio de aplicación separado. Las cosas COM parecen cargar ensamblajes en el dominio predeterminado, en lugar del dominio de aplicación desde el que se llama el material COM.¿La interoperabilidad COM respeta los límites del Dominio de aplicación .NET para la carga de ensamblaje?
Lo que quiero saber es: ¿es este comportamiento esperado, o estoy haciendo algo mal para causar que estos ensamblados relacionados con COM se carguen en el AppDomain incorrecto? Por favor, consulte una descripción más detallada de la situación a continuación ...
La aplicación consta de 3 conjuntos: - el EXE principal, el punto de entrada de la aplicación. - common.dll, que contiene solo una interfaz IController (en el estilo IPlugin) - controller.dll, que contiene una clase de controlador que implementa IController y MarshalByRefObject. Esta clase hace todo el trabajo y usa interoperabilidad COM para interactuar con otra aplicación.
La parte pertinente de la EXE principal se parece a esto:
AppDomain controller_domain = AppDomain.CreateDomain("Controller Domain");
IController c = (IController)controller_domain.CreateInstanceFromAndUnwrap("controller.dll", "MyNamespace.Controller");
result = c.Run();
AppDomain.Unload(controller_domain);
El common.dll solamente contiene estas 2 cosas:
public enum ControllerRunResult{FatalError, Finished, NonFatalError, NotRun}
public interface IController
{
ControllerRunResult Run();
}
Y el controller.dll contiene esta clase (que también llama a la información de interoperabilidad COM):
public class Controller: IController, MarshalByRefObject
Cuando ejecuta por primera vez la aplicación, Assembly.GetAssem blies() se ve como se esperaba, con common.dll cargado en ambos AppDomains, y controller.dll solo se está cargando en el dominio del controlador. Después de llamar a c.Run(), sin embargo, veo que los ensamblados relacionados con las cosas de interoperabilidad COM se han cargado en el AppDomain predeterminado, y NO en el AppDomain desde el que se está llevando a cabo la interoperabilidad COM.
¿Por qué podría estar ocurriendo esto?
Y si está interesado, aquí hay un poco de historia:
Originalmente esta era una aplicación de dominio de aplicación 1. El material COM con el que interactúa es una API de servidor que no es estable durante largos períodos de uso. Cuando se produce una COMException (sin información de diagnóstico útil sobre su causa) del material COM, toda la aplicación debe reiniciarse antes de que la conexión COM funcione nuevamente. La simple reconexión al servidor de la aplicación COM da como resultado de inmediato excepciones COM. Para hacer frente a esto, he tratado de mover las cosas de interoperabilidad COM en un Dominio de Aplicación separado para que cuando se produzcan las COMExcepciones misteriosas, pueda descargar el DominioDeaplicación en el que ocurre, crear uno nuevo y comenzar de nuevo, todo sin tener que reiniciar manualmente la aplicación . Esa fue la teoría de todos modos ...
fyi, si alguien más echa un vistazo a esto, son las DLL de la API de HP Quality Center las que me dan este problema. Lo solucioné haciendo que la aplicación se reiniciara, pero aún estaría realmente interesado en por qué estaba sucediendo esto. – Xiaofu