2010-06-14 13 views
7

나는 문제가있어 어제부터 해결하려고 노력하지만 운이 없다. 32 비트 델파이 DLL을 .NET Win 응용 프로그램에서 가져 오려고합니다. 이 응용 프로그램은 모든 CPU 모드에서 빌드해야합니다. 물론, 거기에 BadImageFormatException x64 응용 프로그램에서로드 할 수 없다는 것을 의미합니다 오는 xll .. 내가 봤 거든 주위에 솔루션을 찾을 래퍼를해야하지만, 그것은 나를 위해 명확하지 않았다. 아무도이 문제를 해결하는 방법을 말할 수있는 가능한 방법은 내가 32 비트 델파이 DLL을 모든 CPU 또는 x64 모드 (어쩌면 다른 솔루션) builted 가져올 수 있습니다.64 비트 .Net 응용 프로그램에서 가져 오는 32 비트 dll

+2

왜 .NET 응용 프로그램을 x86으로 컴파일하지 않습니까? – OregonGhost

+2

왜 CPU로 컴파일해야합니까? 32 비트 응용 프로그램은 64 비트 OS에서 실행됩니다. – juharr

+1

@OregonGhost 그것은 21 세기이기 때문에. – sproketboy

답변

5

일반적으로 관리되지 않는 32 비트 DLL을 관리되는 32 비트 래퍼 DLL로 래핑하고 COM으로 표시 할 수 있습니다. 이렇게하면 COM 인터페이스를 통해 래퍼 DLL을 호출 할 수 있습니다.

COM 대리자를 사용하여 COM dll을 프로세스 외부 COM 서버로 표시 할 수 있습니다. 이 주제에 대한 자세한 내용은 다음을 참조하십시오. Access x86 COM from x64 .NET.

2

필자가 이해 하듯이 64 비트 응용 프로그램에서 32 비트 DLL을 사용할 방법이 없습니다. 즉, X86 용 응용 프로그램 만 컴파일 할 수 있습니다.

발견 된 해결책은 응용 프로그램이 32 비트 또는 64 비트 버전에서 실행되는지 여부에 따라 "모든 CPU"로 컴파일 된 프로젝트에서 32 비트 및 64 비트 버전 모두에 대해 존재하는 DLL을 사용하는 방법에 관한 것일 수 있습니다. bit 환경.

이렇게하려면 C#에서 두 개의 래퍼 DLL을 작성하고 하나는 64 비트 용으로, 다른 하나는 32 비트 용으로 작성하고 64 비트 또는 32 비트 OS에서 실행 중인지 여부에 따라 각각의 래퍼를 사용할 수 있습니다 .

그러나 모든 기능이 32 비트 DLL 인 경우에는 작동하지 않습니다. 64 비트 응용 프로그램은 32 비트 DLL을 사용할 수 없으며 32 비트 응용 프로그램은 64 비트 DLL을 사용할 수 없습니다.

32 비트 응용 프로그램을 컴파일해야하거나 DLL의 64 비트 버전을 만들어야합니다.

+0

현재 DLL (32 비트 버전) 만 있고 다른 DLL (64 비트 버전)을 사용할 수있는 기회는 없습니다. .NET 응용 프로그램은 모든 CPU (64 비트도 고려함)로 컴파일해야합니다. 이 사건에 대한 해결책이 없습니까? – scatterbraiin

+0

글쎄, Lasse V. Karlsen이 제안한 것처럼 별도의 프로세스로 시작하고 프로세스 간 통신을 사용하여 "대화"하는 별도의 32 비트 응용 프로그램 (라이브러리가 아닌!)을 작성할 수 있습니다. –

1

약간의 엉망이 있지만 명령을 보내거나받는 콘솔 응용 프로그램과 같은 64 비트 응용 프로그램에서 말할 수있는 별도의 32 비트 응용 프로그램을 작성하는 것이 해결책 일 수 있습니다.

가끔 전화가 필요할 경우 작동하지 않을 수 있습니다.

+0

필자는 정확히 그렇게하려고하지는 않았지만 클래스 라이브러리를 썼다. Delphi DLL을 가져 와서 x86을 컴파일 한 다음 64 비트 기본 응용 프로그램을 참조했지만 여전히 운이 없다. – scatterbraiin

+0

동일한 문제이기 때문에 더 복잡한 경우에만 발생합니다. 64 비트 응용 프로그램은 32 비트 클래스 라이브러리도 사용할 수 없습니다! Mikael은 Named Pipes 나 다른 IPC 방법을 통해 의사 소통하는 32 비트 응용 프로그램에 대해 말하고있었습니다. –

+0

나는 그것이 IPC를 통해 가능하다는 것을 알았지 만, 나에게 분명하지 않은 진실을 말할 수있다. 그것에 대해 약간의 지시가있을 가능성이 있는가 ?? 그것이 나를 위해 정말로 새로운 것이기 때문에 나는 더 많은 세부 사항이 필요하다. – scatterbraiin

14

당신이해야 할 일은 32 비트 프로세스에서 32 비트 DLL 파일을 호스팅하는 래퍼 응용 프로그램을 작성하는 것입니다.

그러면 64 비트 응용 프로그램은 네트워크 수단을 통해이 32 비트 프로세스와 통신하거나 COM 개체를 통해 DLL 기능을 사용할 수있게해야합니다.

은 아무리 노력해도 64 비트 프로세스 내에서 32 비트 DLL을 실행할 수 없으므로 32 비트 프로세스에서 실행해야합니다.

응용 프로그램을 32 비트 용으로 컴파일하는 것이 옵션이 아닌 경우 호스트 응용 프로그램을 만들 수밖에 없습니다.

+0

내가 그것을 할 수있는 방법을 조금의 근원이라도 줄 수 있냐? 세부 정보 설명은 어디에서 확인할 수 있습니까? 고마워요 – scatterbraiin

+0

64 비트 응용 프로그램도 32 비트 COM 구성 요소를 사용할 수 없다고 확신합니까? 32 비트 COM 컨트롤을 사용하기 전에이 문제가 있었고 C86 프로젝트를 X86으로 컴파일 할 때까지 오류가 발생했습니다. –

+0

유감스럽게도이 옵션은 나를위한 것이 아닙니다. ( – scatterbraiin

1

.NET 응용 프로그램을 Platform x86으로 컴파일하기 만하면됩니다. x64 컴퓨터에서 실행되며 32 비트 DLL을 사용합니다. 포장지에 시간을 낭비하지 마십시오.

+0

기본 OS가 64 비트 인 경우 옵션이 아닙니다. OS 레이어를 통과하는 예외를 삼켜 버리고 볼 수 없기 때문입니다! – XMight

+0

64 비트 OS에서 32 비트 .Net 앱을 실행할 수있는 곳을 꿈꿔 왔지만 예외는 "삼켜졌습니다"... – user7116

+2

이것은 꿈이 아니지만 몇 달 동안의 개발 조건입니다. 나는 64 비트 개발 기계를 가지고 있고, x86 플랫폼 용으로 컴파일하면 예외가 삼킨다 (병렬 작업뿐 아니라). Visual Studio는 출력 창에서 "예외의 첫 번째 기회"를 보여 주며 클라이언트 응용 프로그램에서는 보이지 않습니다. 이유 : http://blog.paulbetts.org/index.php/2010/07/20/the-case-of-the-disappearing-onload-exception-user-mode-callback-exceptions-in-x64/ – XMight

관련 문제