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

有关如何在Visual Studio中执行此操作的信息很少。没有官方的答案,只有那些破解了解决方案的人。例如http://www.netframeworkdev.com/msbuild/msbuild-linkresource-nonassembly-external-file-beforecompile-24358.shtml。这曾经在VS2008上起作用,但是看起来在VS2010上不起作用...:-/

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

提前致谢,
阿尔马达

最佳答案

尽管有警告,我还是设法使它在vs2010中工作。

1)覆盖CoreCompile以添加LinkResources

2)添加一个目标,以获取与作为<LinkResource Include="native.dll" />添加的任何内容等效的“本地复制”

3)如果包含 native 库/文件的项目仅包含那些文件,请添加类型/接口(interface)。在使用引用的项目中使用此类型。 IE。您使用DllImport的项目。防止编译器优化项目依赖项。

4)进行修订,亚历克斯·亚库宁(Alex Yakunin)的 trick复制项目依赖项。

这会将所有依赖项拉入我的$(TargetDir)中,以供调试。

在项目文件中,我在常规目标文件ala之后导入魔术

  <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>

关于.net - Visual Studio 2010中的/LinkResource,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4625129/

10-13 01:59