Estoy tratando de configurar el COM libre de registro, pero tengo un pequeño problema porque otro objeto COM puede ser el cliente.Registro Com y dll manifiestos
App.exe -----> servidor COM/Client DLL (registrados o no) --------> COM DLL de servidor (no registrado)
Mi pregunta es, ¿es posible para crear un manifiesto para el segundo dll (servidor COM/cliente dll)? No tengo control del ejecutable, pero si lo hiciera, esto funciona si creo un manifiesto de cliente para el ejecutable y un manifiesto de servidor para el dll del servidor COM.
este es el archivo de manifiesto para el dll intermedio. Intenté incrustarlo y lo intenté de forma externa. Aún no funciona.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity type="win32"
name="COMCliSer.dll"
version="1.0.0.0"
/>
<dependency>
<dependentAssembly>
<assemblyIdentity
name="COMSer.dll"
version="1.0.0.0"
/>
</dependentAssembly>
</dependency>
</assembly>
En una investigación adicional, que puede conseguir todo esto funcione, siempre que el DLL medio está también libre de registro y el exe tiene un manifiesto de aplicación. Tan pronto como registre el dll intermedio y abandone el manifiesto de la aplicación (no tengo control de qué exe usará mi dll), todo deja de funcionar.
Si el exe no tiene manifiesto, entonces el manifiesto de dll no se tiene en cuenta. Puedo probar esto al configurar todo para que funcione. Luego, poner un error en el manifiesto de la asamblea. Esto muestra el mensaje habitual:
No se puede crear el proceso: esta aplicación no se ha podido iniciar porque la configuración de la aplicación es incorrecta. Reinstalar la aplicación podría resolver el problema.
Si a continuación, colocar el manifiesto de aplicación, se carga la aplicación (aunque el CoCreateInstance falla porque las dependencias no se tienen en cuenta)
¿por qué llama el conjunto 'comser.dll'? ¿La información del manifiesto de la asamblea se fusionó? Es mucho más fácil implementar un ensamblado con un nombre descriptivo, p. "Microsoft.VC90.CRT", que contiene dll con diferentes nombres: "msvcr90.dll". Cuando se trata de conjuntos dll, se vuelve más difícil depurar ya que un único manifiesto ahora tiene dos propósitos: describir el contenido del ensamblado a los consumidores, Y describir las dependencias del archivo DLL en el ensamblado. –
¡Los nombres han sido cambiados para proteger a los inocentes! Esos no son los nombres reales. Son dlls COM nativos y no ensamblados .NET. – Steve
Además, ¿con qué "no funciona" cuenta? ¿El exe y el 2nd dll cargan y simplemente fallan al instanciar el 3ro, o el exe, o 2nd dll no se carga por completo? Hacer que las cosas realmente no se carguen es un buen paso, ya que significa que el sistema está viendo el manifiesto y registrando un error en el sistema, o en la aplicación, al menos en el registro de eventos. Si simplemente está fallando en la llamada a CoCreateInstance, entonces probablemente no pueda ver el manifiesto en absoluto. –