2017-02-03 17 views
2

я использую пример Microsoft для COM-сервера: Out-of-process C# COM server (CSExeCOMServer)Как начать 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; 
    } 

Это фактически работает напрямую. Сервер появился в 32-х битах из-за его настроенной целевой платформы платформы x86. Но у меня 64-битная ОС, и теперь я хочу запустить ее на 64-битной основе. Регистрация выполняется в событии после сборки сервера. Поэтому я изменил регистрацию (используя файл reg64.exe Framework64), чтобы сервер также был зарегистрирован на 64-битной основе. Затем я изменил цель платформы на AnyCPU. Если я начинаю клиент теперь висит на линии

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

Но я вижу в диспетчере задач, что сервер был правильно запущен в 64bits. После того, как время 1мин или таким образом я получаю следующее исключение:

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()

Если я начинаю ехе сервера вручную и попробуйте подключиться к нему с помощью COM снова я вижу в диспетчере задач, что клиент начинает вверх второго сервера вместо того, чтобы подключаться к первому. Это действительно 64 бит, но исключение происходит, и после закрытия клиента второй сервер также закрывается. Если я заставляю сервер быть 32-битным в AnyCPU с предпочтительным 32-битным флагом, все работает отлично, но в 32 бит. Если я устанавливаю платформу на x64, все отлично работает и на 64-битной. Поэтому он не работает только в конфигурации AnyCPU, если он запускается на 64-битной основе.

Есть ли у кого-нибудь идеи, что я делаю неправильно? Мне действительно нужен COM-сервер для работы в AnyCPU конфигурации даже с 64-битной. На самом деле я не хочу иметь отдельный 32-битный и 64-битный exe. Это сработало, когда я протестировал его кстати.

Благодарим за помощь.

+0

_ "... Клиент запускает второй сервер, а не подключается к первому ...«_ - Если вы не используете« COM-синглтоны »через IROT, то это нормальное поведение. – MickyD

+0

[AnyCPU Exes обычно больше проблем, чем стоит) (https://blogs.msdn.microsoft.com/rmbyers/2009/06/09/anycpu-exes-are-обычно-more-trouble-than-theyre-worth /) –

+0

@MickyD Да, вы правы, я использую Singleton COM Server. Вот почему я нашел это странным поведением. Если я это сделаю то же самое с конфигурацией рабочей платформы есть только один сервер за раз. – 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 требует отдельных регистраций COM для 32-битных и 64-битных и двух разных COM-серверов вне процесса; поэтому вам нужен 32-битный COM-EXE, а также 64-разрядный exe. У вас не может быть одного для обоих.

Вы увидите примеры этого повсюду, как:

  • битном конкретной версии расширений оболочки для Windows Explorer. например TortoiseSVN; TortoiseGit. Проводник Windows, работающий на 64-битной Windows, допускает только 64-разрядные расширения; так же для работы на 32-разрядных ОС Windows

  • отдельный 32 и 64-разрядные версии Microsoft Office (который был COM/Ole в течение некоторого времени) с той же разрядности для COM надстройки

Единственный способ, которым вы можете : быть в состоянии обойтись, скажем, желая, чтобы 32-разрядный клиент подключился к 64-битовому серверу, - если вы добавите соответствующие записи DCOM и запустите свой сервер в другом окне (под управлением Windows 64 бит) с вашим клиентом, подключающимся к нему по сети. Хотя, вероятно, это не особенно полезно.

+0

На самом деле все, что вам нужно, это 32-разрядные и 64-разрядные прокси-серверы, которые вы, вероятно, так или иначе захотите. –

+0

Хорошо, я понимаю. Спасибо за ваш ответ Ребята. поэтому есть такая вещь, как AnyCPU. Чтобы иметь один exe, который работает на 32-битной ОС с 32-разрядной и 64-разрядной версиями на 64-битной ОС. Но вы не можете это сделать, если используете COM-интерфейс прямо? – MaLe

+0

@MaLe Это один из примеров использования любого процессора, d – MickyD