я использую пример 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. Это сработало, когда я протестировал его кстати.
Благодарим за помощь.
_ "... Клиент запускает второй сервер, а не подключается к первому ...«_ - Если вы не используете« COM-синглтоны »через IROT, то это нормальное поведение. – MickyD
[AnyCPU Exes обычно больше проблем, чем стоит) (https://blogs.msdn.microsoft.com/rmbyers/2009/06/09/anycpu-exes-are-обычно-more-trouble-than-theyre-worth /) –
@MickyD Да, вы правы, я использую Singleton COM Server. Вот почему я нашел это странным поведением. Если я это сделаю то же самое с конфигурацией рабочей платформы есть только один сервер за раз. – MaLe