2014-01-10 2 views
1

내 유형 공급자는 일부 네이티브 x64 라이브러리를 사용합니다. 내 타입 제공자 라이브러리를 anyCpu x64 플래그로 컴파일했습니다. 이제F # 형식 Visual Studio에서 x64 라이브러리를 사용하는 공급자

, 나는 Visual Studio에서 다른 프로젝트의 인텔리에서 내 타입 공급자를로드 할 때 나에게 다음과 같은 오류 제공 :

The type provider '...my type provider...' reported an error: An attempt was made to load a program with an incorrect format (Exception from HRESULT: 0x8007000B

그냥 단지로, 코드를 실행하지 않고 내가이 오류를 얻을, 그것은 명확하게하기를 형식 공급자를 Visual Studio에 등록합니다.

fsi의 32 비트에서로드하려고하면 같은 오류가 발생합니다. 하지만 fsianycpu 또는 64 비트 fsi으로 시도하면 문제가 없습니다. 내 유형 및 자동 완성은 fsi에 있습니다.

VS 자체가 x86이기 때문에 IntelliSense/정적 코드 분석 또한 x86이기 때문에 어떤 시점에서는 x86 라이브러리에 의존하는 유형 공급자 코드를로드하려고 시도하고 오류 팝업이 발생합니다.

불행히도이 라이브러리는 x64 만 지원합니다.

이 작업을 함께 할 수있는 방법이 있습니까?

+1

제공자가 원시 64 비트 라이브러리를 사용하는 경우 AnyCPU로 컴파일해서는 안됩니다. 그렇지 않습니다. 확실히 그것은 32 비트 컴퓨터에서 (또는 Visual Studio로 32 비트 프로세스 내부에서) 실행할 수 없습니다. –

+0

맞습니다. 64 비트로 간주해야합니다. – Klark

답변

4

제공자가 원시 64 비트 라이브러리를 사용하는 경우 32 비트 대체를 제공 할 수있는 경우가 아니면 AnyCPU로 컴파일하지 말아야합니다. 확실히 그것은 32 비트 컴퓨터에서 (또는 Visual Studio로 32 비트 프로세스 내부에서) 실행할 수 없습니다.

하나의 가능한 해결 방법은 코드가 32 비트 프로세스 내에서 호출 될 때 대체 관리 대상 메소드 (또는 빈 스텁)를 제공하는 것입니다. 예를 들어 :

static class NativeInterop { 
    [DllImport("My64BitLibrary.dll", EntryPoint = "DoStuff")] 
    private static int DoStuff64(int value); 

    public static int DoStuff(int value) { 
     if (Environment.Is64BitProcess) 
      return DoStuff64(value); 

     // This is a 32 bit process, I just return a dummy value 
     // for Visual Studio integration (if applicable) 
     return 0; 
    } 
} 

귀하의 코드를 직접 가져 오기를 호출하지 않습니다 DoStuff() 기능, 대신 64 개 비트 프로세스에 기본 기능으로 통화를 재전송하는 관리되는 래퍼를 호출 할 수 있습니다 그것은에 다른일을 수행 할 수 있습니다 32 비트 환경. JIT가이 메소드를 컴파일 할 때 종속성이로드 될 때 (실제로 호출 될 때가 아니라) 종속성이로드 될 경우 두 번째 레벨의 간접 지정을 추가해야 할 수도 있습니다 (테스트되지 않은 솔루션).

어디서나 적용 할 수 없다고 가정합니다. 64 비트 코드를 호출하는 위치와 작동하는 스텁을 제공 할 수 있는지에 따라 달라집니다. 이 조건을 만족할 수 없다면 64 비트 라이브러리 (AnyCPU로 컴파일 된 경우 중요하지 않음)를 32 비트 프로세스에 통합 할 수있는 기회가 없습니다.

다른 방법 (예 A WCF service used for IPC에 대한) 외부 서비스 플랫폼 특정 코드를 이동할 수 32 개 비트 프로세스 (경우에 당신은 C#을 구현 또는 일부 가짜를 제공하기 위해 관리 할 수 ​​없습니다). 이 프로세스는 항상 64 비트이지만 유형 제공자 (네이티브 라이브러리에 직접적인 종속성이 없으므로)는 AnyCPU로 컴파일 될 수 있으며 32 비트 프로세스 내에서 정상적으로 실행됩니다. 지불 할 가격은 IPC이며 복잡성이 커집니다.

+0

라이브러리가 복잡하고 소스 코드가 없기 때문에 내 32 비트 로직을 제빵 할 수 없습니다.나는 F # 64bit를위한 intellisense를 만들거나, 별도의 실행 파일로 라이브러리를 컴파일하고, 타입 프로 바이더에서 직접 호출하여 출력을 분석하거나, 내부 프로세스 통신 등을 수행하기를 희망했다. – Klark

+0

@Klark 실행 가능하지만 그것은 고통! 예를 들어 WCF 서비스를 설치하고 해당 유형 서버에서 해당 서버에 연결해야합니다. 그렇다면 XY 비트는 중요하지 않습니다. EXE 호스트 WCF 서비스는 64 비트를 실행하고 유형 공급자 (AnyCPU로 컴파일 됨)는 32 비트 프로세스에서 실행됩니다. 가능하지만 성능이 그렇게 좋지는 않을 것입니다. –