visual varios studio solucion referencia references quite puedo puede proyectos proyecto procesar missing marca los importado esta encuentra desea correctamente cargaron archivos agregar c++ .net visual-studio

c++ - varios - visual studio missing references



Copia dependencias nativas localmente en un proyecto de Visual Studio (2)

Tengo un proyecto de C ++ de modo mixto que produce un ensamblado dll administrado que exporta algunas clases CLR (llámelo Managed.dll). Este proyecto está utilizando una dll nativa, (llámela Native.dll).

Cuando hago referencia al Managed.dll de otro proyecto que produce Client.exe, todo funciona como se espera, excepto que necesito copiar manualmente el Native.dll en la misma carpeta que Client.exe.

Si hay una forma de convencer a VS de que copie localmente (en la carpeta bin de Client.exe), ¿no solo Managed.dll sino también Native.dll?

He intentado incluir Native.dll como un ensamblado de dependencia en el manifiesto, pero esto no ayudó.

Editar

Managed.dll va a ser un ensamblado redistribuible. Se instalará en una carpeta en "C: / Archivos de programa ...". Cuando un desarrollador que usa Visual Studio agrega una referencia a Managed.dll, Native.dll también debe copiarse en la carpeta / bin de su proyecto.


Hay varias formas de decirle a la VS que copie los dlls a la carpeta de destino:

1.Agregue la dll como un recurso del proyecto. Y dile a la VS que lo copie si la dll es más nueva

2. Agregue un nuevo proyecto que haga referencia al proyecto dll y configure OutDir en la carpeta que desee. Este proyecto no hace más que copiar la dll.

3.Utilice un PostBuildEvent en el archivo vcxproj

<ItemDefinitionGroup Condition="''$(Configuration)|$(Platform)''==''Debug|Win32''"> <ClCompile> </ClCompile> <Link> </Link> <PostBuildEvent> <Command> echo off mkdir "$(ProjectDir)../../bin/$(Configuration)/" copy "$(OutDir)xxx.dll" "$(ProjectDir)../../lib/$(Configuration)/" echo on </Command> </PostBuildEvent> </ItemDefinitionGroup>

4.Utilice un PreBuildEvent en el archivo vcxproj

5.Utilice CustomBuild en el archivo vcxproj

<ItemGroup> <CustomBuild Include="../../xxx.dll"> <FileType>Document</FileType> <Command> call mkdir &quot;$(OutDir)&quot; 2&gt;nul &amp; copy /Y &quot;../../xxx.dll&quot; &quot;$(OutDir)xxx.dll&quot; </Command> <Message>Copying xxx.dll to $(OutDir)/xxx.dll</Message> <Outputs>$(OutDir)/xxx.dll</Outputs> </CustomBuild> </ItemGroup>

6.Utilice un makefile y copie dll en makefile. y usa nmake para construir

7.Escriba un archivo bat que haga el trabajo de copia e invoque el archivo bat como se indica en 3-6

8.Utilice un script como python, que también puede descargar la DLL de Internet. E invoca el archivo py como en 3-6.

9. Otras herramientas de construcción pueden ayudar también, como Gradle

10. Hazlo un plugin de NuGet

11.A veces escribo un bate y lo ejecuto manualmente.

Actualización 01 (ejemplo dll de extracción automática):

1. Agregarle dll nativo como recurso de dll administrado

2.Agrega este método init ()

using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; namespace DllSelfExtract { public class SelfExtract { public static void Init() { String managedDllPath = System.Reflection.Assembly.GetExecutingAssembly().CodeBase; String nativeDllPath = managedDllPath.Replace("file:///", "").Replace("DllSelfExtract.DLL", "TestDll.dll"); if(!File.Exists(nativeDllPath)) { Stream dllIn = Assembly.GetExecutingAssembly().GetManifestResourceStream("DllSelfExtract.TestDll.dll"); if (dllIn == null) return; using (Stream outFile = File.Create(nativeDllPath)) { const int sz = 4096; byte[] buf = new byte[sz]; while (true) { int nRead = dllIn.Read(buf, 0, sz); if (nRead < 1) break; outFile.Write(buf, 0, nRead); } } } //LoadLibrary Here } } }

3. En el proyecto que usa su dll administrado, invoque primero el método init ()

SelfExtract.Init();

Actualización 02 (ejemplo NuGet):

1.Crear un nuevo proyecto NuGet

2. Coloque los ensamblados administrados en el directorio / lib

3. Coloque las bibliotecas compartidas no administradas y los archivos relacionados en el subdirectorio / build y cambie el nombre de todos los * .dll no administrados a * .dl_

4. Agregue un archivo .targets personalizado en el subdirectorio / build con algo como los siguientes contenidos:

<?xml version="1.0" encoding="utf-8"?> <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ItemGroup> <AvailableItemName Include="NativeBinary" /> </ItemGroup> <ItemGroup> <NativeBinary Include="$(MSBuildThisFileDirectory)*"> <TargetPath></TargetPath> </NativeBinary> </ItemGroup> <PropertyGroup> <PrepareForRunDependsOn> $(PrepareForRunDependsOn); CopyNativeBinaries </PrepareForRunDependsOn> </PropertyGroup> <Target Name="CopyNativeBinaries" DependsOnTargets="CopyFilesToOutputDirectory"> <Copy SourceFiles="@(NativeBinary)" DestinationFiles="@(NativeBinary->''$(OutDir)/%(TargetPath)/%(Filename).dll'')" Condition="''%(Extension)''==''.dl_''"> <Output TaskParameter="DestinationFiles" ItemName="FileWrites" /> </Copy> <Copy SourceFiles="@(NativeBinary)" DestinationFiles="@(NativeBinary->''$(OutDir)/%(TargetPath)/%(Filename).%(Extension)'')" Condition="''%(Extension)''!=''.dl_''"> <Output TaskParameter="DestinationFiles" ItemName="FileWrites" /> </Copy> </Target> </Project>

5.Agregue la regla de compilación para la carpeta de compilación en Package.nuspec

<files> <file src="lib/" target="lib" /> <file src="tools/" target="tools" /> <file src="content/" target="content" /> <file src="build/" target="build" /> </files>

6. Construir el paquete

7.En su otro proyecto de C # simplemente agregue este paquete de NuGet.


Utilizar la opción /ASSEMBLYLINKRESOURCE en las propiedades del enlazador parece ser la solución más sencilla. Hace que Visual Studio considere la dll nativa como parte del ensamblaje. Además, de acuerdo con la documentación proporcionada por Microsoft, permite que la DLL nativa se instale en la memoria caché de ensamblados global

Para establecer esta opción de vinculador en un proyecto de Visual C ++:

  • Haga clic derecho en el nombre del proyecto y seleccione Propiedades
  • Seleccione la carpeta Linker
  • En la página de propiedades de entrada , busque la opción Recurso de enlace de ensamblaje.
  • Escriba el nombre del archivo del ensamblaje nativo, por ejemplo, MyNative.dll

Necesitará un evento Post Build para copiar la dll nativa a la carpeta de salida.

Hacer referencia al ensamblaje administrado desde cualquier otro proyecto visual, obliga a la dll nativa a copiarse junto con el ensamblaje administrado en la carpeta / bin.