.net /VisualStudio2010中的链接资源

.net /VisualStudio2010中的链接资源,.net,visual-studio,visual-studio-2010,wrapper,gac,.net,Visual Studio,Visual Studio 2010,Wrapper,Gac,/linkresource是一个csc选项,允许将程序集链接到其非托管依赖项。将托管程序集添加到GAC时,依赖项将放置在同一文件夹中。这就是所有.NET包装器的安装方式 关于如何在VisualStudio中执行此操作的信息很少。没有官方的答案,只有黑客破解了一个解决方案的人。例如这曾经在VS2008上起作用,但看起来在VS2010上不起作用…:-/ VS2010是否以简单、干净的方式支持LinkResources 提前感谢,, aalmada我设法在vs2010中实现了这一点,尽管有警告 1)覆

/linkresource是一个csc选项,允许将程序集链接到其非托管依赖项。将托管程序集添加到GAC时,依赖项将放置在同一文件夹中。这就是所有.NET包装器的安装方式

关于如何在VisualStudio中执行此操作的信息很少。没有官方的答案,只有黑客破解了一个解决方案的人。例如这曾经在VS2008上起作用,但看起来在VS2010上不起作用…:-/

VS2010是否以简单、干净的方式支持LinkResources

提前感谢,,
aalmada

我设法在vs2010中实现了这一点,尽管有警告

1)覆盖CoreComile以添加链接资源

2)添加一个目标,在添加为

3)如果包含本机库/文件的项目仅包含这些文件,请添加类型/接口。在使用引用的项目中使用此类型。即您使用DllImport的项目。防止编译器优化项目依赖关系

4)点击亚历克斯·雅库宁的复制项目依赖项

这会将所有依赖项拉入my$(TargetDir)以备调试

在项目文件中,我在常规目标文件之后导入magic

  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  <Import Project="$(ProjectDir)..\..\External\CopyDependencies.targets" />

我有一个CopyDependencies.targets,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <Target
    Name="CoreCompile"
    Inputs="$(MSBuildAllProjects);
                @(Compile);                               
                @(_CoreCompileResourceInputs);
                $(ApplicationIcon);
                $(AssemblyOriginatorKeyFile);
                @(ReferencePath);
                @(CompiledLicenseFile);
                @(EmbeddedDocumentation); 
                $(Win32Resource);
                $(Win32Manifest);
                @(LinkResource);
                @(CustomAdditionalCompileInputs)"
    Outputs="@(DocFileItem);
                 @(IntermediateAssembly);
                 @(_DebugSymbolsIntermediatePath);                 
                 $(NonExistentFile);
                 @(CustomAdditionalCompileOutputs)"
    Returns=""
    DependsOnTargets="$(CoreCompileDependsOn)"
    >
    <!-- These two compiler warnings are raised when a reference is bound to a different version
             than specified in the assembly reference version number.  MSBuild raises the same warning in this case,
             so the compiler warning would be redundant. -->
    <PropertyGroup Condition="('$(TargetFrameworkVersion)' != 'v1.0') and ('$(TargetFrameworkVersion)' != 'v1.1')">
      <NoWarn>$(NoWarn);1701;1702</NoWarn>
    </PropertyGroup>

    <PropertyGroup>
      <!-- If we are building in visual studio setting the CscToolPath will prevent the inproc compiler from being used during compile-->
      <CscToolPath Condition="'$(CscToolPath)' == '' and '$(BuildingInsideVisualStudio)' != 'true'" >$(MsBuildToolsPath)</CscToolPath>
    </PropertyGroup>

    <ItemGroup Condition="'$(TargetingClr2Framework)'=='true'">
      <ReferencePath>
        <EmbedInteropTypes/>
      </ReferencePath>
    </ItemGroup>

    <PropertyGroup>
      <!-- If the user has specified AppConfigForCompiler, we'll use it. If they have not, but they set UseAppConfigForCompiler,
                 then we'll use AppConfig -->
      <AppConfigForCompiler Condition="'$(AppConfigForCompiler)' == '' and '$(UseAppConfigForCompiler)' == 'true'">$(AppConfig)</AppConfigForCompiler>
    </PropertyGroup>

    <!-- Condition is to filter out the _CoreCompileResourceInputs so that it doesn't pass in culture resources to the compiler -->
    <Csc  Condition=" '%(_CoreCompileResourceInputs.WithCulture)' != 'true' "
          AdditionalLibPaths="$(AdditionalLibPaths)"
          AddModules="@(AddModules)"
          AllowUnsafeBlocks="$(AllowUnsafeBlocks)"
          ApplicationConfiguration="$(AppConfigForCompiler)"
          BaseAddress="$(BaseAddress)"
          CheckForOverflowUnderflow="$(CheckForOverflowUnderflow)"
          CodePage="$(CodePage)"
          DebugType="$(DebugType)"
          DefineConstants="$(DefineConstants)"
          DelaySign="$(DelaySign)"
          DisabledWarnings="$(NoWarn)"
          DocumentationFile="@(DocFileItem)"
          EmitDebugInformation="$(DebugSymbols)"
          ErrorReport="$(ErrorReport)"
          FileAlignment="$(FileAlignment)"
          GenerateFullPaths="$(GenerateFullPaths)"
          KeyContainer="$(KeyContainerName)"
          KeyFile="$(KeyOriginatorFile)"
          LangVersion="$(LangVersion)"
          LinkResources="@(LinkResource)"
          MainEntryPoint="$(StartupObject)"
          ModuleAssemblyName="$(ModuleAssemblyName)"
          NoConfig="true"
          NoLogo="$(NoLogo)"
          NoStandardLib="$(NoCompilerStandardLib)"
          NoWin32Manifest="$(NoWin32Manifest)"
          Optimize="$(Optimize)"
          OutputAssembly="@(IntermediateAssembly)"
          PdbFile="$(PdbFile)"
          Platform="$(PlatformTarget)"
          References="@(ReferencePath)"
          Resources="@(_CoreCompileResourceInputs);@(CompiledLicenseFile)"
          ResponseFiles="$(CompilerResponseFile)"
          Sources="@(Compile)"
          TargetType="$(OutputType)"
          ToolExe="$(CscToolExe)"
          ToolPath="$(CscToolPath)"
          TreatWarningsAsErrors="$(TreatWarningsAsErrors)"
          UseHostCompilerIfAvailable="$(UseHostCompilerIfAvailable)"
          Utf8Output="$(Utf8Output)"
          WarningLevel="$(WarningLevel)"
          WarningsAsErrors="$(WarningsAsErrors)"
          WarningsNotAsErrors="$(WarningsNotAsErrors)"
          Win32Icon="$(ApplicationIcon)"
          Win32Manifest="$(Win32Manifest)"
          Win32Resource="$(Win32Resource)"

              />

    <ItemGroup>
      <_CoreCompileResourceInputs Remove="@(_CoreCompileResourceInputs)" />
    </ItemGroup>

    <CallTarget Targets="$(TargetsTriggeredByCompilation)" Condition="'$(TargetsTriggeredByCompilation)' != ''"/>

  </Target>


  <PropertyGroup>
    <CopyLinkedResources Condition="'$(CopyLinkedResources)'==''">true</CopyLinkedResources>
  </PropertyGroup>

  <PropertyGroup>
    <CopyDependencies
      Condition="'$(CopyDependencies)'==''">true</CopyDependencies>
    <CopyDependenciesPdb
      Condition="'$(CopyDependenciesPdb)'==''">true</CopyDependenciesPdb>
    <CopyDependenciesXml
      Condition="'$(CopyDependenciesXml)'==''">true</CopyDependenciesXml>
  </PropertyGroup>


  <Target Name="CopyLinkedResources">
    <Message Text="Copy Linked Resources"></Message>
    <Copy SourceFiles="@(LinkResource->'%(FullPath)')"
          DestinationFolder="$(OutputPath)"
          SkipUnchangedFiles="true">
      <Output TaskParameter="CopiedFiles"
        ItemName="LinkResourceCopied" />
    </Copy>
    <Message Text="Copy Linked Resource: %(LinkResourceCopied.FullPath)" Importance="low"/>
  </Target>



<Target Name="CopyIndirectDependencies"
          Condition="'$(CopyIndirectDependencies)'=='true'"
          DependsOnTargets="DetectIndirectDependencies"
          Inputs="@(IndirectDependencyToCopy)"
          Outputs="@(MatchingOutputDependency)">
    <Copy SourceFiles="@(IndirectDependencyToCopy)"
          DestinationFiles="@(MatchingOutputDependency)"
          SkipUnchangedFiles="true">
      <Output TaskParameter="CopiedFiles"
              ItemName="IndirectDependencyCopied" />
    </Copy>
    <Message Importance="low"
             Condition="'%(IndirectDependencyCopied.FullPath)'!=''
                         and '%(IndirectDependencyCopied.Extension)'!='.pdb'
                         and '%(IndirectDependencyCopied.Extension)'!='.xml'"
             Text="Indirect dependency copied: %(IndirectDependencyCopied.FullPath)" />
  </Target>

  <Target Name="DetectIndirectDependencies"
          DependsOnTargets="ResolveAssemblyReferences">

    <Message Importance="low"
             Text="Direct dependency: %(ReferencePath.Filename)%(ReferencePath.Extension)" />
    <Message Importance="low"
             Text="Indirect dependency: %(ReferenceDependencyPaths.Filename)%(ReferenceDependencyPaths.Extension)" />

    <!-- Creating indirect dependency list -->
    <ItemGroup>
        <DetectedIndirectDependency Include="%(ReferenceDependencyPaths.FullPath)" 
                                    Condition="'%(ReferenceDependencyPaths.CopyLocal)'=='true'"/>
    </ItemGroup>

    <ItemGroup Condition="'$(CopyIndirectDependenciesXml)'=='true'">
        <DetectedIndirectDependency Include="%(ReferenceDependencyPaths.RootDir)%(ReferenceDependencyPaths.Directory)%(ReferenceDependencyPaths.Filename).xml"
                                    Condition="'%(ReferenceDependencyPaths.CopyLocal)'=='true'" />
    </ItemGroup>  

    <ItemGroup Condition="'$(CopyIndirectDependenciesPdb)'=='true'">
        <DetectedIndirectDependency Include="%(ReferenceDependencyPaths.RootDir)%(ReferenceDependencyPaths.Directory)%(ReferenceDependencyPaths.Filename).pdb"
                                    Condition="'%(ReferenceDependencyPaths.CopyLocal)'=='true'"/>
    </ItemGroup>


    <!-- Work out which dependencies actually exist in the file system -->
    <ItemGroup>
        <IndirectDependencyToCopy Include="@(DetectedIndirectDependency)" 
                                  Condition="Exists('%(DetectedIndirectDependency.Identity)')" />          

        <MatchingOutputDependency Include="@(IndirectDependencyToCopy->'$(OutputPath)%(Filename)%(Extension)')" />
    </ItemGroup>

  </Target>

  <!-- Build sequence modification -->

  <PropertyGroup>
    <CoreBuildDependsOn>
      $(CoreBuildDependsOn);
      CopyDependencies;
      CopyLinkedResources
    </CoreBuildDependsOn>
  </PropertyGroup>
</Project>

美元(诺瓦恩);1701;1702
$(MsBuildToolsPath)
$(AppConfig)
真的
真的
真的
真的
$(CoreBuildDependsOn);
版权依赖;
复制链接资源

非常不幸的是,Visual Studio 2012 RC有一系列新的构建操作,但仍然没有链接资源选项…:-(您有2019 studio的解决方案吗?我添加了您的目标文件并收到错误MSB4057:项目中不存在目标“CopyDependencies”。很抱歉,如果2019年的目标“CopyDependencies”无法正常工作,您需要重新设计它。