2011-01-07 49 views
7

/linkresource là một tùy chọn csc cho phép liên kết một assembly với các phụ thuộc không được quản lý của nó. Khi assembly được quản lý được thêm vào GAC, các phụ thuộc được đặt trong cùng một thư mục. Đây là cách tất cả các trình bao bọc .NET nên được cài đặt .../LinkResource trong Visual Studio 2010

Có rất ít thông tin về cách thực hiện việc này trong Visual Studio. Không có câu trả lời chính thức, chỉ những người đã tấn công một giải pháp. Ví dụ: http://www.netframeworkdev.com/msbuild/msbuild-linkresource-nonassembly-external-file-beforecompile-24358.shtml. Điều này được sử dụng để làm việc trên VS2008 nhưng có vẻ như nó không hoạt động trên VS2010 ...: -/

VS2010 có hỗ trợ LinkResources một cách đơn giản và rõ ràng không?

Cảm ơn trước, aalmada

Trả lời

5

tôi quản lý để có được điều này để làm việc trong VS2010 dù với cảnh báo.

1) Override CoreCompile thêm LinkResources

2) Thêm một mục tiêu để có được tương đương với Sao chép địa phương về bất cứ điều gì thêm vào như <LinkResource Include="native.dll" />

3) Nếu dự án có chứa các bản địa thư viện/tệp chỉ chứa các tệp đó, thêm loại/giao diện. Sử dụng loại này trong dự án bằng cách sử dụng các tham chiếu. I E. dự án nơi bạn sử dụng DllImport. Ngăn chặn trình biên dịch tối ưu hóa sự phụ thuộc của dự án.

4) Tack trêntrick để sao chép phụ thuộc dự án Alex Yakunin của.

Điều này kéo tất cả các phụ thuộc vào $ (TargetDir) của tôi đã sẵn sàng để gỡ lỗi.

Trong các tập tin dự án tôi nhập sự kỳ diệu sau khi các mục tiêu thường xuyên tập tin ala

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

Và tôi có một CopyDependencies.targets như sau:

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

Nó rất đáng tiếc rằng Visual Studio 2012 RC có một loạt các hành động xây dựng mới nhưng vẫn không có tùy chọn tài nguyên liên kết ... :-( – aalmada