programing

전체를 만드는 방법.NET Framework 애플리케이션을 단일 .exe 파일로 사용하시겠습니까?

newstyles 2023. 5. 9. 22:10

전체를 만드는 방법.NET Framework 애플리케이션을 단일 .exe 파일로 사용하시겠습니까?

데이터베이스가 없는 소프트웨어를 개발했습니다.의 독립 실행형 .exe를 생성합니다..exe 파일만 사용자에게 소프트웨어를 사용하도록 제공할 수 있도록 NET Framework 프로젝트입니다.

안타깝게도 프로젝트의 독립 실행형 .exe를 에서 생성하는 방법을 모르겠습니다.그물.

이 문제에 대한 지침을 가지고 있는 사람이 있습니까?

IL Merge 같은 거요?

GUI도 있습니다.

참고: 실제로 둘 다 시도해 본 적이 없습니다.

저기 코스투라가 있습니다.Fody는 추가적으로 설치할 필요가 없는 모든 것을 하나의 exe로 컴파일합니다.nuget를 통해 설치할 수 있지만 nuget의 최신 버전은 FodyWeavers.xml 파일을 만들 수 없으므로 수동으로 설치해야 합니다.

마침내 완벽한 답을 찾았습니다.

페이지가 너무 오래되어서 사진 없이 전체 페이지를 올릴 예정입니다. 삭제될까 봐 걱정입니다.

저는 "복사하지 마세요"라는 언급을 굳이 하지 않았습니다.또한 추가할 수 없어서 4단계를 완전히 건너뛰었습니다.이미 Nuget Manager에서 추가하고 있는 것과 관련이 있는지 궁금합니다.

결국에는 exe 파일을 꺼내 HDD에서 아무 곳에서나 실행할 수 있었습니다.

위 링크에서 복사됨:

얼마 전 Visual Studio 2008에서 작은 C# WinForms 애플리케이션을 작업했습니다.애플리케이션의 배포 프로세스를 간소화하기 위해 모든 구성 요소를 하나의 exe 파일로 묶으면 훨씬 더 쉽게 관리할 수 있습니다.그러나 exe 파일에 dll 파일을 포함하는 것에 대한 문서 및 자습서가 오래되었거나 불완전하거나 단순히 작동하지 않았습니다.

그 중 가장 좋은 예는 MSDN 블로그에 올린 책에서 발췌한 것입니다.유감스럽게도, 제시된 대로 작동하지 않았고, 구현 방법 및 구현 장소에 대한 명확한 지침이 포함되지 않았습니다.하지만, 그것은 여전히 매우 좋은 출발점을 제공했습니다.Visual Studio 디버거의 도움을 받아 몇 가지 조사, 시행 및 오류를 거친 후 해결책이 있습니다.

참고: 이 방법을 사용하면 프로젝트 내의 하위 폴더 또는 일련의 하위 폴더에 dll 파일을 배치할 수 있습니다.하위 폴더(프로젝트 루트에 dll 파일 배치)를 사용하지 않거나 dll 파일을 포함하는 하위 폴더에 대한 하드 코드 경로를 사용하려는 경우 더 적합한 다른 방법이 있지만 여기서는 다루지 않습니다.

  1. dll 파일 자체는 단순히 참조하는 것이 아니라 Visual Studio 프로젝트에 포함되어야 합니다.프로젝트에서 dll 파일을 저장할 폴더를 프로젝트 루트에 생성합니다(프로젝트 이름 > 추가 > 새 폴더를 마우스 오른쪽 버튼으로 클릭).저는 제 이름을 "lib"이라고 지었습니다.

  2. dll(및 함께 제공되는 지원 또는 정의 파일)을 복사하여 lib 폴더에 붙여넣습니다.이 튜토리얼의 목적을 위해 사용된 예제 dll은 Cassia입니다.

  3. 그런 다음 dll을 프로젝트 리소스로 포함합니다.프로젝트 이름 > 속성(또는 프로젝트 메뉴 > 프로젝트 이름 속성)을 마우스 오른쪽 버튼으로 클릭합니다.리소스 탭으로 이동합니다.

다음과 같이 "파일"을 선택합니다.

리소스 추가를 클릭하고 파일 형식을 "모든 파일"로 변경한 후 dll이 있는 "lib" 파일로 이동합니다.선택한 후 "열기"를 누릅니다.

이제 dll 파일을 프로젝트 리소스로 포함해야 합니다.

  1. 프로젝트의 dll 파일에 참조를 추가합니다.솔루션 탐색기 창에서 "참조" > 참조 추가(또는, 프로젝트 메뉴 > 참조 추가)를 마우스 오른쪽 버튼으로 누르십시오.찾아보기 탭을 클릭하고 dll이 있는 lib 폴더로 이동한 다음 dll 파일을 선택하고 "확인"을 클릭합니다.그러면 dll에 대한 참조가 프로젝트의 참조 폴더 아래에 나타납니다.

  2. 기본적으로 컴파일된 파일과 프로젝트 참조는 프로젝트가 빌드될 때 bin 폴더에 복사됩니다.이를 방지해야 합니다."참조" 폴더에서 dll 파일에 대한 참조를 선택합니다.속성 창(또는 오른쪽 클릭 > 속성)에서 "출력 디렉터리에 복사"라는 속성을 찾고 값을 false로 설정합니다.

그런 다음 "lib" 폴더에서 dll 파일을 선택합니다.속성 창에서 "출력 디렉토리에 복사" 속성을 찾고 값을 "복사 안 함"으로 설정합니다.

또한 "Build Action" 특성을 찾고 값을 "Embedded Resource"로 설정합니다.프로젝트가 빌드될 때 파일을 처리하고 액세스하는 방법을 나타냅니다.

마지막으로 dll 파일과 함께 제공되는 도움말 파일 및 XML 정의 파일과 같은 외부 파일을 제외합니다. 이 파일은 프로젝트를 빌드할 때 필요하지 않습니다.파일(예: XML 정의 파일)을 마우스 오른쪽 단추로 클릭하고 "프로젝트에서 제외"를 클릭합니다.이제 프로젝트가 빌드될 때 bin 폴더에 복사되지 않습니다.

  1. 실행 중인 WinForm의 코드 보기에 네임스페이스 시스템을 포함합니다.반사.이것은 내장된 dll 파일을 로드하는 일부 코드에 중요합니다.

  2. WinForm을 실행하는 코드 보기에서 이 코드는 생성자 메서드(일반적으로 양식과 동일한 이름)에 배치되어야 합니다.InitializeComponent() 메서드 ''' AppDomain 앞에 나타나야 합니다.현재 도메인.어셈블리Resolve + = (variable, args) = > {string resourceName = new AssemblyName(args)이름), 이름 + ".vmx", 문자열 리소스 = 배열.찾아보세요.GetType().어셈블리.GetManifestResourceNames(), 요소 => 요소입니다.종료 대상(resourceName);

    (var stream = 어셈블리)를 사용합니다.실행 어셈블리를 가져옵니다.GetManifestResourceStream(리소스) {Byte[] 어셈블리Data = newByte[stream].길이]; 스트림.(어셈블리 데이터, 0, 어셈블리 데이터)를 읽습니다.길이); 어셈블리를 반환합니다.로드(어셈블리 데이터); } }; '''

exe를 시작할 때 이 코드는 필요한 dll 파일과 참조 중인 dll 파일을 탐지하고 내장된 위치에서 로드하는 역할은 다음과 같습니다.

  1. 이제 실행 중인 WinForms 응용 프로그램의 코드 보기에서 dll 파일의 네임스페이스를 포함할 수 있습니다.

  2. 모든 항목을 테스트하려면 dll 파일의 네임스페이스에서 코드를 구현하여 AssemblyResolve 이벤트를 트리거해야 합니다.그러나 생성자 내에 DLL 네임스페이스의 코드를 포함하는 경우 응용프로그램입니다.실행()은 WinForms 응용 프로그램이 빌드되고 실행될 때 dll 파일에 대해 "file not found" 오류를 발생시킵니다.

이 문제를 해결하려면 dll 파일 네임스페이스를 사용하는 코드를 생성자 메서드 이외의 다른 메서드에 배치해야 합니다.이는 어셈블러의 이벤트 핸들러를 호출하는 것과 동일한 메서드 내에 배치할 수 없기 때문입니다.할 수 있을 정도로 간단하지만, 주의해야 할 점은 한 가지뿐입니다.

시험해 봤어요.

  • IL 머지
  • 코스투라.포디
  • 파일을 리소스에 추가하고 원본 exe를 dll로 실행할 새 exe를 컴파일합니다.

모두 작동했지만 다른 PC에 복사하려고 하면 Windows Defender에서 모두 멀웨어로 플래그가 지정되었습니다(2021-06-17).바이러스 합계에 대한 빠른 검색을 통해 다른 바이러스 백신 솔루션에도 영향을 미친다는 것을 확인했습니다.DLL을 로드하는 방법을 변경하면 안티바이러스 휴리스틱이 트리거되는 것 같습니다.

그런 다음 시작할 때 프로그램의 압축을 풀고 임시 디렉토리에서 DLL로 프로그램을 시작하기 위해 자체 추출 보관소를 사용하려고 했습니다.저는 7z와 Winrar를 다양한 설정으로 사용해 보았습니다.제가 찾은 유일한 믿을 만한 조합은 다음과 같습니다.

  • WinRar v6.02 사용(작성 시점의 현재 버전, 다른 버전도 작동할 수 있음)
  • 추출 대화 상자를 사용하도록 설정된 상태로 유지(숨기면 잘못된 긍정이 증가함)
  • 64비트 zip 압축 사용(32비트 zip 또는 rar를 사용하면 false positive도 증가함)

이것은 32비트에서 실행되지 않을 것이고 실행 시 추출 대화 상자가 잠깐 동안 나타날 것이라는 경고와 함께 프로그램을 실행하기 위해 두 번 클릭할 수 있는 exe 파일을 제공합니다.

virustotal.com 에서 0/66의 탐지율을 달성했습니다. https://www.virustotal.com/gui/file-analysis/MDMxZmI3OWZiYTU3MTU1YWIxYmFmYTM0MjM4ZmE1MmE6MTYyMzkzMjY4OA==/https

분명히 이것은 미래에 바뀔 수도 있기 때문에, 더 신뢰할 수 있는 방법은 당신의 exe를 dll과 함께 압축된 디렉토리로 배포하거나 설치 프로그램을 사용하는 것입니다.

여기에 이미지 설명 입력 여기에 이미지 설명 입력 여기에 이미지 설명 입력 여기에 이미지 설명 입력 여기에 이미지 설명 입력

Visual Studio에서 프로젝트를 빌드할 때 .exe가 자동으로 생성됩니다.프로젝트의 /bin/debug 또는 /bin/Release 폴더에서 찾을 수 있습니다.그러나 해당 폴더에 .exe 이외의 다른 파일이 포함되어 있으면 해당 폴더 전체를 최종 사용자에게 제공해야 합니다.

PS: "디버그" 대신 .exe의 "릴리스" 버전만 제공하는 것이 좋습니다.

다른 사람들은 .exe 질문을 다루었기 때문에 일반적인 개발 지점이 아닌 곳에서 코드를 검토하고 향후 개발에서 다시 사용할 수 있는 함수/클래스를 식별하고 싶을 수 있습니다.

그런 다음 이를 별도로 추출할 수 있습니다.DLL은 사용자에게 소프트웨어를 제공하지만 다음 애플리케이션의 개발은 조금 더 쉬워질 것이고 기능의 개선 사항은 두 애플리케이션 모두에서 쉽게 채택될 수 있습니다.

설치 프로젝트를 만들고(msdn에서 조회) 설치 프로그램 내에서 프로젝트 출력 파일을 패키지화합니다.Visual Studio는 설치 관리자 및 부트스트랩된 exe 파일을 생성합니다. exe 또는 msi 파일을 사용하여 응용 프로그램을 실행할 수 있습니다.

Visual Studio에서 프로젝트를 실행하면 응용 프로그램의 exe가 디버그 폴더에 생성됩니다. 이 exe를 친구에게 제공하여 응용 프로그램을 테스트할 수 있습니다.그렇지 않으면 시각적 스튜디오의 응용프로그램에 설정 프로젝트를 만듭니다.MSDN에서 설치 프로젝트에 대한 도움말을 사용할 수 있습니다.설치 프로젝트는 시장에서 사용할 수 있는 다른 소프트웨어와 마찬가지로 응용 프로그램의 설정을 생성하며, 사용자는 이 설정을 친구에게 제공하여 사용할 수 있습니다.

.Net 프로젝트는 컴파일될 때 응용 프로그램의 속성에 설정된 디버그/릴리스 경로에 대한 exe 파일을 제공합니다.당신은 사용자에게 관련 소스 코드나 프로젝트 파일을 주지 않고 소프트웨어를 사용할 수 있도록 하기 위해 자체 추출 애플리케이션 설정 exe 파일을 요청하는 것 같습니다.패키지화를 시도하려면 무료로 제공되는 응용 프로그램 패키지를 사용하거나 innosetup 또는 Nsis를 사용하여 설정 파일로 패키지화할 수 있습니다.저는 이노 셋업을 사용하고 그것은 쉽습니다.

언급URL : https://stackoverflow.com/questions/3261942/how-to-build-a-whole-net-framework-application-as-a-single-exe-file