gpt4 book ai didi

.net -/LinkResource 在 Visual Studio 2010 中

转载 作者:行者123 更新时间:2023-12-04 08:29:43 25 4
gpt4 key购买 nike

/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" /> 的任何内容上获得等效的 Copy Local

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

4) 粘贴 亚历克斯·亚库宁的 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 -/LinkResource 在 Visual Studio 2010 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4625129/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com