una - no se puede agregar referencia.dll c#
¿Cómo agrego una referencia a un proyecto de C++ no administrado llamado por un proyecto de C#? (4)
Add Rederences solo funciona para ensamblados .NET, proyectos .net en la misma solución o para componentes COM (para lo cual se creará un contenedor de administrador de todos modos ...).
el hecho de que en su código C # acceda a la DLL de C ++ con DLLImport no significa que Visual Studio sabrá dónde debe copiarse la dll externa.
Imagina que DLLImport es una opción de tiempo de ejecución, la ruta que has puesto allí se usa en tiempo de ejecución para buscar el dll, por lo que tienes que implementar el c ++ dll y ponerlo a disposición para la aplicación .NET, generalmente en la misma carpeta bin.
Una solución (the.sln)
Un proyecto de C ++ (mycppproject.vcxproj en 2010 o mycppproject.vcproj en 2008) que compila una DLL nativa que exporta algunas funciones. En la depuración esto construye c: / output / Debug / mycppproject_d.dll y en la versión esto construye c: / output / Release / mycppproject.dll.
Una aplicación de consola C # (mycsharpconsole.csproj) que contiene llamadas de Invoke en la DLL.
Todo compila bien.
Cuando construyo, me gustaría poder agregar una referencia del proyecto csharp al proyecto cpp DLL para que pueda copiar el archivo apropiado del directorio apropiado en el directorio / bin / Debug en el que está integrado el proyecto csharp.
Esto debería ser posible, ya que el IDE sabe todo lo que hay que saber sobre dónde se construye el DLL, y dónde se construye la aplicación C #.
En Visual Studio 2010:
Probé "Dependencias ..." en el proyecto csharp y agregué una dependencia en mycppproject, pero eso no tiene ningún efecto.
Intenté "Agregar referencia ..." en el proyecto csharp y agregué una referencia al proyecto cpp, pero recibí un mensaje de advertencia "La versión de Target Framework para el proyecto" mycppproject "es más alta que la versión actual del Target Framework del proyecto . ¿Te gustaría agregar esta referencia a tu proyecto de todos modos? (Sí / No / Cancelar).
Al hacer clic en "Sí" aparece el mensaje de error "No se pudo agregar una referencia a mycppproject".
No puede agregar una referencia a una DLL no administrada.
En su lugar, debe realizar una tarea posterior a la compilación para copiar el archivo.
De forma alternativa, puede agregar un enlace a la DLL no administrada como un archivo en el proyecto C # y establecer Build Action
en None
y Copy to Output Directory
para Copy If Newer
.
Visual Studio no admite la referencia de un proyecto de C ++ no administrado desde un C # administrado, pero MSBuild permite hacer referencia a cualquier proyecto desde cualquier otro proyecto.
Puede agregar manualmente una referencia a su proyecto editando el archivo .csproj manualmente. En el archivo, encuentre su conjunto existente de elementos ProjectReference
(o agregue un nuevo ItemGroup
si no tiene uno) y agregue la siguiente referencia:
<ProjectReference Include="../mycpproject.csproj">
<Project>{b402782f-de0a-41fa-b364-60612a786fb2}</Project>
<Name>mycppproject</Name>
<ReferenceOutputAssembly>false</ReferenceOutputAssembly>
<OutputItemType>Content</OutputItemType>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</ProjectReference>
Cuando realiza la compilación, la referencia hará que MSBuild construya primero el proyecto al que se hace referencia. El valor ReferenceOutputAssembly
le dice a MSBuild que no copie el ensamblaje de salida de la construcción (ya que el proyecto C ++ no produce uno), pero los valores OutputItemType
y CopyToOutputDirectory
instrucciones para copiar el contenido de salida a la carpeta de salida del proyecto de referencia.
Podrá ver la referencia en Visual Studio, pero no puede hacer mucho con ella allí.
Esta respuesta se basa en un problema similar resuelto por Kirill Osenkov en su blog de MSDN: https://blogs.msdn.microsoft.com/kirillosenkov/2015/04/04/how-to-have-a-project-reference-without-referencing-the-actual-binary/
Yo seguiría la segunda respuesta de Slaks ...
[...] puede agregar un enlace a la DLL no administrada como un archivo en el proyecto C # y establecer Acción de compilación en Ninguno y Copiar al directorio de salida para copiar si es más reciente.
... seguido de mi comentario , para diferenciar entre versiones Debug y Release (incluso si es un poco "hackish", ya que requiere que edite manualmente el archivo del proyecto C #)
abra el archivo csproj de su proyecto C # con un editor de texto y busque todas las ocurrencias de "YourNativeCppProject.dll" (sin el subfondo ".dll", de modo que si agregó también archivos pdb como un enlace, encontrará más de una aparición), y cambie la ruta Incluir utilizando macros, por ejemplo: Include = "$ (SolutionDir) $ (ConfigurationName) / YourNativeCppProject.dll
PD: si nos fijamos en las propiedades (F4), VS muestra la ruta del depurador, incluso si cambia a la configuración de la versión, pero si compila, verá que el dll copiado a la salida es la versión de lanzamiento *