Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 自动将本机dll复制到Visual Studio中引用项目的bin文件夹_C#_Visual Studio_Dll_Unmanaged - Fatal编程技术网

C# 自动将本机dll复制到Visual Studio中引用项目的bin文件夹

C# 自动将本机dll复制到Visual Studio中引用项目的bin文件夹,c#,visual-studio,dll,unmanaged,C#,Visual Studio,Dll,Unmanaged,我有一些本机dll,必须根据平台条件复制到bin文件夹中。我希望将它们复制到引用此项目的项目的bin文件夹中 如果我将构建操作设置为“内容”,则它们将复制到bin文件夹,但保留文件夹结构,因此它们将不在bin文件夹中,而是在子文件夹中。因此,在运行程序时,它将无法解析dll,因为它们位于子文件夹中 例如,如果我在项目文件中有此代码 <Choose> <When Condition=" '$(Platform)'=='x86' "> <ItemGr

我有一些本机dll,必须根据平台条件复制到bin文件夹中。我希望将它们复制到引用此项目的项目的bin文件夹中

如果我将构建操作设置为“内容”,则它们将复制到bin文件夹,但保留文件夹结构,因此它们将不在bin文件夹中,而是在子文件夹中。因此,在运行程序时,它将无法解析dll,因为它们位于子文件夹中

例如,如果我在项目文件中有此代码

<Choose>
    <When Condition=" '$(Platform)'=='x86' ">
      <ItemGroup>
        <Content Include="nativedll\somelib\x86\somelib.dll">
          <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
        </Content>
      </ItemGroup>
    </When>
    <When Condition=" '$(Platform)'=='x64' ">
      <ItemGroup>
        <Content Include="nativedll\somelib\x64\somelib.dll">
          <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
        </Content>
      </ItemGroup>
    </When>
  </Choose>
但是dll会复制到项目的bin文件夹中,但不会复制到引用它的项目的bin文件夹中

所以我现在的解决方案是在所有使用这个脚本的项目中添加一个构建后脚本


在Visual Studio中是否有更好的方法来执行此操作?

尝试将此方法用于必须复制的每个文件csproj文件-创建项目组:

<ItemGroup>
   <ContentWithTargetPath Include="mySourcePath\myFile.dll">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    <TargetPath>myFile.dll</TargetPath>
 </ContentWithTargetPath >
</ItemGroup>
引用项目还应包含复制的文件

以下内容也可能有所帮助:


我给出了我在得到@dajuric anwser之前使用的解决方案。 我更喜欢dajuric解决方案,因为它不涉及在其他文件夹中查找代码

我在csproj中使用了条件内容

<When Condition=" '$(Platform)'=='x86' ">
      <ItemGroup>
        <Content Include="nativedll\somelib\x86\somelib.dll">
          <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
        </Content>
      </ItemGroup>
    </When>
//same for x64
    ...

如果你想要一些坚如磐石的东西,你可以将DLL作为嵌入式资源嵌入,当你的库初始化时,它会检查DLL是否存在于正确的文件夹中,如果不存在,它会将它们从嵌入式资源写入磁盘。通过这种方式,您不能在包中包含所有文件,这些文件将被重建,即使是在意外删除的情况下也是如此。比如c:\ProgramFiles\yadayada。允许任何人任意添加或替换DLL不是一个可靠的功能。谢谢!这正是我想要的。很高兴我的回答帮助了你。关于附加的dll路径,我认为您可以在互操作类的静态构造函数中使用Environment.SetEnvironmentVariablePATH,Environment.GetEnvironmentVariablePATH,而不是调用内核函数。在中也会执行相同的操作:。
<When Condition=" '$(Platform)'=='x86' ">
      <ItemGroup>
        <Content Include="nativedll\somelib\x86\somelib.dll">
          <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
        </Content>
      </ItemGroup>
    </When>
//same for x64
    ...
        [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool SetDllDirectory(string lpPathName);

 SetDllDirectory(@".\nativedll\somelib\x"+ (Environment.Is64BitProcess ? "64" : "32"));