2011-01-09 11 views
4

this page에 작성된 제프리 리히터 (Jeffrey Richter)의 방법을 사용하여 .dll 라이브러리를 내 응용 프로그램에 병합하기 위해 새로운 아이디어를 생각한 이후로 내 other question을 죽이기로 결정했습니다. 그래서 내 .dll 파일을 임베디드 리소스로 추가하고이를 참조로 추가했습니다..NET에서 .dll 어셈블리 병합

... 
    [STAThread] 
    static void Main() 
    { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      string[] args = Environment.GetCommandLineArgs(); 
      if (args.Length > 1) 
       _in = args[1]; 
      SingleInstanceController controller = new SingleInstanceController(); 
      controller.Run(args); 

      AppDomain.CurrentDomain.AssemblyResolve += (sender, argsx) => 
{ 
String resourceName = "AssemblyLoadingAndReflection." + 
    new AssemblyName(argsx.Name).Name + ".dll"; 
using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)) 
{ 
    Byte[] assemblyData = new Byte[stream.Length]; 
    stream.Read(assemblyData, 0, assemblyData.Length); 
    return Assembly.Load(assemblyData); 
    } 
} 
     ; 

는 뭔가 다른에 resourceName이 변경 해야하는 건가요 : 그럼 Program.cs에서, 나는이 추가 (나는 그가 게시 된 코드가 이동하도록되어 아무 생각이 없다)? 올바른 장소에 올바르게 추가 했습니까?

이제 문제는 어셈블리를 찾지 못하고로드하지 못하고 내가 잘못했는지 확실하지 않다는 것입니다. 어떤 도움을 주시면 감사하겠습니다.

+2

그냥 호기심이 많습니다. 심지어 왜 (효과적으로) 정적으로 DLL을 링크하는 것을 귀찮게합니까? –

+3

내 프로그램을 배포하고 싶지 않기 때문에 사용자가 쓸모없는 파일을 10-15 개 발견하게됩니다. – Iceyoshi

+2

어쨌든 사용자가 프로그램 파일에서 왜 파고 들어 있습니까? 하위 디렉토리에 설치하고 완료하십시오. 제 말은, "DLL"의 "DL"은 당신이 알고있는 "Dynamic Link"를 의미합니다. –

답변

1

AppDomain이 진입 점과 첫 번째 줄에서 참조를 확인하기 전에 AssemblyResolve 이벤트에 후크합니다.

포함 된 리소스 이름은 응용 프로그램 이름과 리소스 이름으로 시작됩니다. 예 : ConsoleApplication.Test.dll.

+0

첫 줄에 무슨 뜻인지 모르겠다. 설명 할 수 있겠 니? (미안하지만 C#에 익숙하지 않고 많은 경험이 없습니다.) – Iceyoshi

+0

AppDomain.CurrentDomain.AssemblyResolve + = ....를 Main 메서드의 첫 번째 줄로 이동하십시오. –

+0

"파일, 버전을로드 할 수 없습니다. 파일, 버전 = 2.3.4025.2210, 문화 = 중립, PublicKeyToken = null '또는 종속성 중 하나입니다. 잘못된 포인터 (HRESULT의 예외 : 0x80004003 (E_POINTER))" 그렇게하고 내 리소스 이름을 바꿉니다. – Iceyoshi

2

디버거를 사용하십시오. AssemblyResolve 할당 및 람다 본문에 중단 점을 설정합니다. 단일 단계 코드.

네, 너무 늦었습니다. 과제를 이동하십시오. SingleInstanceController가 이러한 DLL에 있으면 Main() 메서드도 시작되지 않습니다. 이 코드를 별도의 도우미 메서드로 옮기고 [MethodImpl (MethodImplOptions.Noinlining)] 특성을 부여하십시오.

프로그램을 하나의 파일로 배포하는 것은 이미 매우 잘 지원되어 있으므로 코드 나 DLL을 병합 할 필요가 없습니다. 바탕 화면 바로 가기, 파일 연결 및 오래된 컴퓨터에 .NET 설치하기 등도 처리합니다. setup.exe

+2

내 질문을 완전히 무시해 주셔서 감사합니다. 나는 왜 내 코드가 제대로 작동하지 않거나 잘못하고 있는지 물어 봤다. ".dll 파일을 내 응용 프로그램과 함께 배포해야하는지 아닌지"에 대한 질문을 던졌습니다. .dll 파일을 여러 개 사용하여 .EXE 파일을 배포하지 않은 이유가 있습니다. 또한 setup.exe의 출처는 어디입니까? 내 응용 프로그램은 상대적으로 작고 휴대용이며 응용 프로그램을 사용하고 싶지도 않습니다. – Iceyoshi

+0

나는 당신의 질문을 무시하지 않았다. 당신은 대답을 무시했다. 마지막 단락 이상을 읽으려고 시도하십시오. 문제를 디버깅 할 때까지 완벽한 대답을 얻지 못할 것입니다. –

+0

"문제를 디버깅 할 때까지"- 내가 도움이 필요했기 때문에 여기에서 질문했습니다. 당신은 내가 첫 번째 단락을 무시한다는 의미에서 옳다. – Iceyoshi

3

귀하의 문제는 이것과 매우 유사합니다 : C#: How to embed DLL into resourcefile (no dll copy in program directory)Main 컴파일 실패했기 때문에 기본적으로, 당신의 AppDomain.AssemblyResolve 이벤트 처리기가 호출되지 않은

. 컴파일 했더라도 이벤트 핸들러를 연결하면 main에서 가장 먼저해야합니다.

위의 질문에 대한 나의 대답은 작동하는 코드 샘플과 코드가 작동하지 않는 이유에 대한 설명이 있습니다.

+0

위대한 게시물, 감사합니다 :-) – shadowf

관련 문제