2011-01-07 21 views
7

/linkresourceは、アセンブリをアンマネージ依存関係にリンクすることができるcscオプションです。マネージアセンブリがGACに追加されると、依存関係は同じフォルダーに配置されます。これは、すべての.NETラッパーをインストールする方法です。/Visual Studio 2010のLinkResource

Visual Studioでこれを行う方法に関する情報はほとんどありません。正式な答えはなく、解決策をハックした人だけです。たとえば、http://www.netframeworkdev.com/msbuild/msbuild-linkresource-nonassembly-external-file-beforecompile-24358.shtmlです。これはVS2008で動作するために使用されましたが、VS2010で動作しないようです: -/

VS2010は簡単でクリーンな方法でLinkResourcesをサポートしますか?事前に

おかげで、 aalmada

答えて

5

は、私は、これは警告とはいえVS2010で動作するように得ることができました。

1)オーバーライドCoreCompileは<LinkResource Include="native.dll" />

3)として追加何でも上のローカルコピーと同等のものを得るためにターゲットを追加LinkResources

2)

を追加する場合はネイティブを含むプロジェクトライブラリ/ファイルにはこれらのファイルのみが含まれ、タイプ/インタフェースを追加します。このタイプは、参照を使用してプロジェクトで使用します。私。 DllImportを使用するプロジェクト。これは、コンパイラがプロジェクトの依存関係を最適化するのを防ぎます。

4)アレックス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> 
+0

はそれは、Visual Studio 2012 RCを持っていることを非常に残念です新しいビルドアクションがたくさんありますが、まだリンクリソースオプションはありません:--( – aalmada

関連する問題