Pregunta

¿Cómo puedo consumir un objeto COM sin registro sin copiar el dll en el mismo directorio que el ejecutable? ¿Es esto posible?

Me gustaría una muestra de trabajo completa o una guía detallada paso a paso para mi situación exacta.

Por ejemplo, tengo los siguientes componentes:
CppTestRunner.exe: aplicación de consola vc ++
CppTests.dll - vc ++ mfc dll
CsCOMServer.dll - c # COM visible dll

No quiero modificar el exe o su directorio, como agregar un manifiesto externo.
CppTests.dll está en un directorio diferente al exe.
Está bien si CsCOMServer.dll está en el mismo directorio que CppTests.dll.

CppTestRunner.exe llama a LoadLibrary en CppTests.dll que funciona bien.

Después de incrustar manifiestos y usar las apis del contexto de activación de Windows, pude copiar CsCOMServer.dll al directorio exe para verificar que CppTests.dll puede crear una instancia de CsCOMServer.dll sin problemas, pero nuevamente, estoy tratando de evite este paso.

Actualmente, con CsCOMServer.dll en el mismo directorio que CppTests.dll y sin CsCOMServer.dll en el directorio exe, aparece el siguiente error cuando llamo a CoCreateInstance:
Error= 0x80070002 El sistema no puede encontrar el archivo especificado.

He usado el monitor de proceso sysinternals para rastrear las rutas en las que busca CppTestRunner.exe, etc. Noto que dependiendo de las cosas que intento hacer, a veces CppTestRunner.exe intenta leer CsCOMServer.dll.config en el mismo directorio que CppTests.dll, pero no importa lo que intente poner allí, no pude obtener pasado el error.
También dependiendo de otras cosas que intento hacer, CppTestRunner.exe intenta leer CsCOMServer.dll en el mismo directorio que CppTests.dll pero, por alguna razón, sigo recibiendo el mismo error.

¿Alguien sabe cómo funciona el código con este escenario exacto?

Como probablemente pueda ver, esto es parte de algunas pruebas unitarias \ de integración.

Como solución alternativa simple, actualmente estoy copiando CppTestRunner.exe en el mismo directorio que CppTests.dll y ejecutándolo desde allí, pero me gustaría evitar este paso.

Gracias.

¿Fue útil?

Solución

.NET Busca la COM GRATIS de registro administrada primero en el GAC, luego en la carpeta del ejecutable.Utiliza el contexto de activación para leer los metadatos de activación, pero no para determinar la ubicación de los archivos en sí.

Otros consejos

Puede guardar la DLL en una subcarpeta, digamos DLLFolder \ YourDll.dll , y en el archivo de manifiesto de su DLL, escriba el nombre del archivo como

<file name = "DLLFolder\YourDll.dll">

Pero debe mantener el archivo de manifiesto (de la DLL) en la ubicación donde se guarda el EXE.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top