을 시작하는 방법 : 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를 별도로 갖고 싶지 않습니다. 어떤 방법으로 그것을 테스트했을 때도 효과가있었습니다.
도움 주셔서 감사합니다.
_ "... 클라이언트가 첫 번째 서버에 연결하는 대신 두 번째 서버를 시작합니다 ..."_ - IROT를 통해"COM 싱글 톤 "을 사용하지 않는 한 정상 동작입니다. – MickyD
[AnyCPU Exes는 일반적으로 가치가있는 것보다 더 많은 문제가 있습니다] (https://blogs.msdn.microsoft.com/rmbyers/2009/06/09/anycpu-exes-are-more-more-trouble-than-theyre-worth /) –
@MickyD 그렇습니다. 저는 Singleton COM 서버를 사용하고 있습니다. 이것이 내가 이상한 행동을 한 이유입니다. 작동중인 플랫폼 구성에서 동일한 작업을 수행 할 때 한 번에 하나의 서버 만 있습니다. – MaLe