2011-10-09 6 views
4

매우 혼란 스럽기 때문에 매우 간단하게 만들 것입니다. COM C++ 응용 프로그램을 통해 사용할 수 있기를 원하는 DLL (VB6에서 작성)이 있습니다. 다음은 내가 취한 조치와 결과입니다. 닷넷 응용 프로그램에 대한 Visual Basic에서 6 dll 파일을 등록하지 않고 배포 된 컴퓨터에서 COM dll 파일을 사용하고 싶습니다.

  • 추가 COM DLL을 통해

    1. 만든 COM DLL을.
    2. 는 86에서 닷넷에 의해 생성 된 "interop.dllName.dll"파일/디버그
    3. 추가 내 된 CodeDom에 참조 된 어셈블리로 상호 운용성 파일이 생성 된 exe 파일을 검색합니다.
    4. 된 CodeDom은 .exe 파일은 .exe 파일이 interop.dllname.dll 파일
    5. 된 CodeDom과 같은 디렉토리에있을 때 내 컴퓨터에서 아름답게 일 .exe 파일이 전혀 하지 일했다 생성 생성 interop.dllname.dll 파일이 .exe 파일과 같은 디렉터리에 존재하더라도 배포 된 컴퓨터에서.

    참고 : 배포 된 시스템이 유효한 DLL 파일로 COM의 .DLL을 인식하지 못하기 때문에

    • 원래 COM의 .DLL는 배포 된 컴퓨터에 등록되어 있지 않습니다.

    • 배포 된 컴퓨터가 x64 환경에서 실행되는 동안 COM .dll은 x86 환경에서 만들어졌습니다 (차이점이 있습니까)?

    내 목표는 무엇입니까 : 나는 된 CodeDom가 interop.dllname.dll 파일에 대한 종속성없이 .exe 파일 실행을 생성해야 할 수 있도록하고 싶습니다. 이러한 dll 파일을 메모리에 저장할 방법이 있습니까? 또한 CodeDom이 생성 한 .exe 파일을 사용하기 전에 내 사용자가 dll 파일을 등록하지 않아도됩니다. 이 일을하는 방법이 있습니까?

    감사합니다.

    는 간단 32/64 비트 불일치를 가지고있는 것처럼 그것은 매우 소리, 당신의 시간을

    에반

  • +1

    왜 배포 된 시스템이 COM DLL을 인식하지 못하는 이유는 무엇입니까? 그것이 문제일까요? – svick

    답변

    3

    을 주셔서 감사합니다. COM DLL이 32 비트이므로 다음을 수행해야합니다.

    1. 이 COM DLL을 사용하는 응용 프로그램이 x86을 대상으로하는지 확인하십시오.
    2. 64 비트 컴퓨터의 SysWow64 폴더에있는 regsvr32의 32 비트 버전으로 COM DLL을 등록하십시오.

    내 생각에 당신은 regsvr32의 64 비트 버전으로 등록하려고합니다. 등록 및 소비와 관련된 모든 것이 32 비트라면 반드시 괜찮을 것입니다.

    +0

    나는 사용자가 dll 파일을 등록해야하는 것을 원하지 않습니다. –

    +0

    그러면 등록 무료 COM을 사용할 수 있습니다. 그러나 DLL이 인식되지 않은 이유를 이해할 때까지는 도움이되지 않습니다. 한 번에 한 가지 문제를 해결하십시오. –

    +0

    dll 파일을 분리하려고 할 때 (등록 무료 COM을 사용하려고 시도 할 때) 내 워크 스테이션에서 다음 오류가 발생합니다 : 'CLSID가있는 구성 요소의 COM 클래스 팩토리 검색 중 {F0527D88-CE11-453B-81D8-418793043E5A} 다음 오류로 인해 실패했습니다 : 80040154. ' 어떤 아이디어? –

    1

    처음 발행 된 interop.name.dll 라이브러리는 디 컴파일로 쉽게 해결할 수 있습니다. 라이브러리를 디 컴파일하고 원본 라이브러리에 소스 코드를 포함하십시오. 모든 역 컴파일 도구를 사용할 수 있습니다. IlSpy는이를 수행해야합니다.

    COM에는 "등록 무료 COM"이라는 기술이 있습니다.이 기술은 Windows XP에 도입되었으며 자세한 내용은 http://msdn.microsoft.com/pl-pl/magazine/cc188708(en-us).aspx입니다. 확실히 작동하지만 x86-x64가 맞지 않아 문제가 발생하는지 확신 할 수 없습니다.

    +0

    interop.dllname.dll 파일을 디 컴파일하여 원본을 내 프로젝트에 직접 추가 한 경우 COM dll을 필요로하는 이유는 무엇입니까? 원래 COM .dll 파일에 대한 종속성이있는 이유는 무엇입니까 ?? –

    +2

    COM dll에는 실제 코드가 들어 있습니다. Interop 어셈블리는 호출 인터페이스의 래퍼 일뿐입니다. –

    2
    1. 64 비트 프로세스는 32 비트 DLL을로드 할 수 없습니다. 이것을 줄이는 한 가지 방법은 .NET 응용 프로그램이 32 비트 전용으로 컴파일되었는지 확인하는 것입니다 (Visual Studio에서 x86이라고 함).
    2. interop dll에 대한 종속성을 제거하려면 VS2010의 'Interop Types Embed'옵션을 평가하십시오. 이 테스트를 직접 해보지는 않았지만 귀하 시나리오와 같이 추가 된 것으로 믿습니다. 등록 무료 COM에 대한
    3. 나는 문서는 당신을위한 출발점으로 도울 수 있다고 생각 : http://msdn.microsoft.com/en-us/magazine/cc188708.aspx#S1