/ Visual Studio 2010中的LinkResource

aal*_*ada 8 .net gac wrapper visual-studio-2010 visual-studio

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

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

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

在此先感谢,aalmada

Luk*_*keN 5

我设法让这个在vs2010中工作,尽管有警告.

1)覆盖CoreCompile以添加LinkResources

2)添加目标以获得与添加的任何内容相同的Copy Local<LinkResource Include="native.dll" />

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

4)解决Alex Yakunin 复制项目依赖关系诀窍.

这将所有依赖项拉入我的$(TargetDir)准备好进行调试.

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

  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  <Import Project="$(ProjectDir)..\..\External\CopyDependencies.targets" />
Run Code Online (Sandbox Code Playgroud)

我有一个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>
Run Code Online (Sandbox Code Playgroud)