2017-02-03 4 views
2

을 시작하는 방법 : Out-of-process C# COM server (CSExeCOMServer)나는 COM-서버에 대한 마이크로 소프트의 예를 사용하십시오 anycpu를 컴파일 된 COM 서버

간단한 콘솔 COM 클라이언트는 단지 서버를 시작하고 메서드, 속성 및 이벤트를 사용해야합니다.

static void Main(string[] args) 
    {    
     Type type = Type.GetTypeFromCLSID(new Guid(SimpleObject.ClassId)); 

     if (type == null) 
     { 
      throw new Exception("ClientObject component is not registered"); 
     } 

     ISimpleObject comObject = (ISimpleObject)Activator.CreateInstance(type); 

     string what = comObject.HelloWorld(); 

     float fvalue = (float) 2.22; 
     comObject.FloatProperty = fvalue; 
     fvalue = (float)3.33; 
     fvalue = comObject.FloatProperty; 
    } 

이것은 실제로 실제로 작동합니다. 서버는 구성된 플랫폼 대상 x86 때문에 32 비트로 나타났습니다. 하지만 저는 64 비트 OS를 가지고 있고 64 비트로 실행하려고했습니다. 등록은 서버의 사후 빌드 이벤트에서 수행됩니다. 그래서 (Framework64 regasm.exe를 사용하여) 등록을 변경하여 서버가 64 비트로 등록되도록합니다. 그런 다음 플랫폼 대상을 AnyCPU로 변경했습니다. 지금 클라이언트를 시작하면 는 라인

ISimpleObject comObject = (ISimpleObject)Activator.CreateInstance(type); 

에 응답하지만 서버가 제대로이 64bit에서 시작되었다 작업 관리자에서 볼 수 있습니다. 의 시간 후 1 분 정도 나는 다음과 같은 예외 얻을 : 나는 손으로 서버 EXE를 시작하고 클라이언트가를 시작되는지 다시 내가 작업 관리자에서 볼 수있는 COM하여 연결을 시도하면

Retrieving the COM class factory for component with CLSID {DB9935C1-19C5-4ED2-ADD2-9A57E19F53A3} failed due to the following error: 80080005 Server execution failed (Exception from HRESULT: 0x80080005 (CO_E_SERVER_EXEC_FAILURE)).

at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark) at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
at System.Activator.CreateInstance(Type type, Boolean nonPublic) at System.Activator.CreateInstance(Type type) at ConsoleClient.Program.Main(String[] args) in C:\Source\User\MaLe\Tests\CSExeCOMServer\C#\ConsoleClient\Program.cs:line 17 at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart()

을 두 번째 서버에 연결할 필요가 없습니다. 이것은 실제로 64 비트이지만 예외가 발생하고 클라이언트를 닫은 후에 두 번째 서버도 닫힙니다. Prefere 32 비트 플래그가있는 AnyCPU에서 서버를 32 비트로 강제 설정하면 모든 것이 32 비트에서 제대로 작동합니다. 플랫폼 타겟을 x64로 설정하면 모든 것이 64 비트에서 잘 작동합니다. 64 비트에서 시작하면 AnyCPU 구성에서만 작동합니다.

내가 뭘 잘못했는지 알 수있는 사람이 있습니까? 64 비트로 AnyCPU 구성에서 실행하려면 COM- 서버가 필요합니다. 나는 실제로 32 비트 및 64 비트 exe를 별도로 갖고 싶지 않습니다. 어떤 방법으로 그것을 테스트했을 때도 효과가있었습니다.

도움 주셔서 감사합니다.

+0

_ "... 클라이언트가 첫 번째 서버에 연결하는 대신 두 번째 서버를 시작합니다 ..."_ - IROT를 통해"COM 싱글 톤 "을 사용하지 않는 한 정상 동작입니다. – MickyD

+0

[AnyCPU Exes는 일반적으로 가치가있는 것보다 더 많은 문제가 있습니다] (https://blogs.msdn.microsoft.com/rmbyers/2009/06/09/anycpu-exes-are-more-more-trouble-than-theyre-worth /) –

+0

@MickyD 그렇습니다. 저는 Singleton COM 서버를 사용하고 있습니다. 이것이 내가 이상한 행동을 한 이유입니다. 작동중인 플랫폼 구성에서 동일한 작업을 수행 할 때 한 번에 하나의 서버 만 있습니다. – MaLe

답변

1

Does anyone have an idea what I do wrong? I really need a COM-Server to run in AnyCPU configuration even with 64bit. I actually do not want to have seperate 32bit and 64bit exe's.

COM은 32 비트 및 64 비트와 두 개의 상이한 독립 프로세스 COM 서버 별도 COM 등록을 요구한다; 따라서 32 비트 COM exe와 64 비트 exe가 필요합니다. 둘 다 가질 수는 없습니다. Windows 탐색기에 대한 셸 확장의

  • 특정 비트 버전 :

    당신처럼 사방이의 예를 볼 수 있습니다. 예 : TortoiseSVN; TortoiseGit. 64 비트 Windows에서 실행되는 Windows 탐색기는 64 비트 확장 만 허용합니다. 유사 윈도우

    32 비트에서 실행되는
  • 별도의 (32)와 COM에 대해 동일한 비트 수에 (지금 몇 시간 동안 COM/올레를하고있다) 마이크로 소프트 오피스의 64 개 비트 버전 - 추가 기능

당신이 적절한 DCOM 등록을 추가하고 (Windows 64 비트를 실행하는) 다른 상자에서 서버를 실행하면 32 비트 클라이언트가 64 비트 서버에 연결되기를 바랄 수있는 유일한 방법입니다. 클라이언트가 네트워크를 통해 클라이언트에 연결되어 있어야합니다. 그것은 아마도별로 유용하지는 않지만.

+0

실제로 필요한 것은 32 비트 및 64 비트 프록시 DLL입니다. –

+0

알겠습니다. 답변 해 주셔서 감사합니다. 이것이 AnyCPU와 같은 것입니다 .64 비트 OS에서 32 비트와 64 비트의 32 비트 OS에서 실행되는 하나의 EXE가 있어야합니다. COM- 인터페이싱을 사용하면이 작업을 수행 할 수 없습니까? – MaLe

+0

@MaLe that 's 이것은 모든 CPU를 사용하는 경우의 한 예입니다. d – MickyD