2009-01-08 48 views
20

Tenemos un (puro C++ nativo) .DLL construido por VS. Como clientes, tenemos algunas aplicaciones C++ nativas y .Net-Wrapper alrededor de esta DLL escrita en C++/CLI. Finalmente, hay algunas aplicaciones de cliente para .Net-Wrapper escritas en C#.¿Cómo vincular un .DLL estáticamente?

Mi problema es que native.dll debe distribuirse de una manera diferente a como funciona el mundo .Net y el VS no realiza un seguimiento de esa DLL. Para que todas mis aplicaciones C# funcionen correctamente, tengo que copiarlas en cada directorio ejecutable o ponerlas en algún lugar en% PATH% (lo cual evitaría en las computadoras reveladoras ya que pueden querer iniciar diferentes aplicaciones con diferentes versiones de la DLL) . Se producen problemas aún mayores si hay UserControls que hacen referencia a la Wrapper-DLL: debe copiar la DLL al directorio de VS o de nuevo a% PATH%. Pero el peor caso ocurre con nuestra herramienta de traducción. Esta herramienta realiza un seguimiento de .Net-Assemblies y los empaqueta en Translator-packages que se pueden enviar a un traductor externo. ¡Hasta donde yo sé, no hay forma de poner el .DLL nativo en ese paquete!

Así que planeo vincular la DLL nativa estáticamente en .Net-Wrapper que resolvería mis problemas. Pero para nuestras aplicaciones nativas esta DLL nativa debe seguir siendo una DLL.

Así que tienen dos opciones:

  • hacer dos proyectos de que (una que genera una biblioteca estática, y uno que crea una dinámica => Trato de evitar esto)
  • Encontrar una solución vincular DLL estáticamente
  • encontrar una manera de dejar que VS generar dos salidas de un proyecto
+0

que puede ser un poco tonto aquí, pero no entiendo por qué sus aplicaciones nativas no puede usar el dll nativo, y sus aplicaciones .net usan el dll C++/cli-wrapped. – Niklas

+0

Pueden ambos. Pero el Wrapper-DLL hace referencia a la DLL nativa, por lo que mis aplicaciones C# necesitan ambas. Lo cual está bien para el contenedor pero es doloroso para la DLL nativa. – mmmmmmmm

+0

¿Por qué no crear una lib para el dll? Dijiste que construiste el dll usando VS, ¿no? –

Respuesta

4

Recoger una copia de DLL to Lib (Edit: Si no puede encontrar una opción más barata)

+6

Un poco caro, ¿verdad? – mmmmmmmm

+1

Es especialmente costoso dado que ya tiene el origen de la DLL. Usted puede simplemente recompilarlo como un archivo lib estático. Pero .Net no lo usará, ya que .Net no hace archivos lib. Eso también significa que DLL to Lib no te ayudará. –

+0

Whoaa, que ha aumentado en un factor de 10 desde que lo compré hace un par de años. ¡Ay! –

5

Otra opción es tener dos proyectos, un proyecto generará un .lib que se puede vincular estáticamente, y un segundo proyecto que generará un .dll y tendrá su .lib como dependencia, debe agregar .def a su .dll con los símbolos que planea exportar, o de lo contrario estará vacío.

+0

Suena bien. Voy a darle una oportunidad. Por el momento, resolví el problema añadiendo obj-Files como entrada adicional al enlazador en Wrapper-DLL (../NativeLib/$(PlatformName)/$(ConfigurationName)/*.obj). ¡Pero esto es un poco crudo y tus opciones suenan mejor! – mmmmmmmm

+0

¿Alguien podría explicar cómo se diferencian .lib y .dll en este contexto? –

+0

En Visual Studio tiene dos tipos de aplicaciones diferentes 'Static Library' y 'DLL'. La opción 'Biblioteca estática' crea un archivo '.lib' pero no es directamente ejecutable, el código del objeto se junta todo sin procesamiento. La opción 'DLL' creará un '.dll' que es ejecutable (es decir, puede usarlo a través de LoadLibrary), el código del objeto se procesa para resolver llamadas a funciones, optimizadas. – Ismael

6

En el archivo de proyecto C++ para la dll, cree dos configuraciones, una que genere una DLL y otra que genere una .lib. No son necesarios dos proyectos, ya que cualquier proyecto .NET/C++ puede admitir varias configuraciones de compilación (así es como las versiones Release y Debug se compilan de forma diferente).

+0

Pero no hay forma de construir dos configuraciones del mismo proyecto de una vez, ¿verdad? Normalmente puede seleccionar una configuración/plataforma de proyecto en el administrador de configuración para una plataforma/configuración de solución. – mmmmmmmm

+0

Puede copiar el proyecto y tener un segundo configurado diferente en esa solución. no te olvides de configurar diferentes directorios intermedios – thewhiteambit

Cuestiones relacionadas