2016-10-19 4 views
0

.NET 외부 DLL을 단일 실행 파일에 결합하기 위해 NuGet 패키지 MSBuild.ILMerge.Task을 사용하고 있습니다. 그것은 매력처럼 작동합니다. 내가 디버깅하는 동안 편집하려고하면어떻게 MSBuild.ILMerge.Task를 일시적으로 비활성화 할 수 있습니까?

지금, 비주얼 스튜디오는 말한다 :

어셈블리가 나는 그것이 가지고있는 단점 같아요

로드되지 않은 경우

변경이 허용되지 않습니다 모든 단일 .exe로 종속성 (나는 그것에 대해 모르겠다, 그것은 단지 추측이다).

하지만 어쨌든 빌드시 MSBuild.ILMerge.Task을 사용하는 것이 좋지만 디버그에서는 사용하지 않는 것이 좋습니다. 아무도 이것을 달성하는 방법을 알고 있습니까?

NuGet을 통해 MSBuild.ILMerge.Task이 설치되면 "다시 작성"을 누르면 자동으로 단일 .exe (.config 파일을 외부에 .config 파일을 외부에 넣음)가 생성됩니다. 당신은 아무것도 구성 할 필요가 없으며, 이것이 왜 프로세스의 내부 동작을 추측 할 수 없으며 프로세스를 비활성화하는 방법입니다.


자세한 내용은 ILMerge에 대한 블로그 게시물을 작성하고 있습니다. 내가 기록하려고 모든 방법에의 문제 및주의 사항 :

http://localcode.wikidot.com/merge-all-binary-files-dll-s-etc-into-a-single-exe


EDIT1 : 나는 NuGet 패키지는 자동으로 다음 정보와 .props 파일을 설정하는 것으로 나타났습니다 :

<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 

나는 DefaultTargets="Build"을 찾고 디버그를 사용 중지하는 방법을 찾았으며 그 방법을 설명하는 것으로 보이는 this post을 발견했습니다.


Edit2가 : 내 .csproj에서이 줄을 제거하면

, 그것은 제대로 ILMerge 편집 건너 뜁니다 : 그것은 뭔가

<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild"> 
<PropertyGroup> 
    <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText> 
</PropertyGroup> 
<Error Condition="!Exists('..\packages\MSBuild.ILMerge.Task.1.0.5\build\MSBuild.ILMerge.Task.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\MSBuild.ILMerge.Task.1.0.5\build\MSBuild.ILMerge.Task.props'))" /> 
<Error Condition="!Exists('..\packages\MSBuild.ILMerge.Task.1.0.5\build\MSBuild.ILMerge.Task.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\MSBuild.ILMerge.Task.1.0.5\build\MSBuild.ILMerge.Task.targets'))" /> 
</Target> 
<Import Project="..\packages\MSBuild.ILMerge.Task.1.0.5\build\MSBuild.ILMerge.Task.targets" Condition="Exists('..\packages\MSBuild.ILMerge.Task.1.0.5\build\MSBuild.ILMerge.Task.targets')" /> 

을하지만, 조금 손수 비현실적 보인다 잠시 동안 ...

답변

4

"릴리스"빌드에 대해서만 ILMerge를 실행하도록 선택하고 "디버그"빌드, 이 경우 디버그 빌드에서 일반적으로하는 것처럼 디버거를 사용할 수 있지만 어셈블리를 단일 실행 파일로 병합 할 준비가되었을 때만 릴리스로 변경하십시오.

이 줄을 당신의 .csproj 파일을 편집하고 변경하여이 작업을 수행 할 수 있습니다

<Import 
    Project="..\packages\MSBuild.ILMerge.Task.1.0.5\build\MSBuild.ILMerge.Task.targets" 
    Condition="Exists('..\packages\MSBuild.ILMerge.Task.1.0.5\build\MSBuild.ILMerge.Task.targets')" /> 

에 :

<Import 
    Project="..\packages\MSBuild.ILMerge.Task.1.0.5\build\MSBuild.ILMerge.Task.targets" 
    Condition="'$(Configuration)'=='Release' AND Exists('..\packages\MSBuild.ILMerge.Task.1.0.5\build\MSBuild.ILMerge.Task.targets')" /> 

의 차이를 '$(Configuration)'=='Release' AND에 조건 속성을 삽입하는 것.

Visual Studio 도구 모음의 디버그/릴리스 드롭 다운 메뉴를 사용하여 빌드 구성을 전환 할 수 있습니다. 또는 빌드> 구성 관리자를 열고 "활성 솔루션 구성"을 변경하십시오.

+1

Nuget 패키지에 매우 유용합니다! 모든 개발 및 릴리스에 디버그 구성을 사용할 수 있습니다. 단위 테스트를 실행할 때 불쾌한 빌드 오류가 발생했으며이 조건 기능으로 인해 시간이 절약되었습니다. –