我为COM-Server:进程外C# COM服务器(CSExeCOMServer)使用了一个Microsoft示例
一个简单的控制台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位的操作系统,现在我想让它在64位内运行。注册是在服务器的post生成事件中完成的。因此,我更改了注册(使用Framework64 regasm.exe),以便服务器也在64位内注册。然后,我将平台目标更改为AnyCPU。如果我现在启动客户端,它就会挂起。
ISimpleObject comObject = (ISimpleObject)Activator.CreateInstance(type);但是我可以从任务管理器中看到服务器是以64位正确启动的。在1分钟左右的时间后,我会得到以下异常:
使用CLSID {DB9935C1-19C5-4ED2-ADD2-9A57E19F53A3}检索组件的COM类工厂,由于以下错误而失败: 80080005服务器执行失败(HRESULT异常: 0x80080005 (CO_E_SERVER_EXEC_FAILURE))。 在System.RuntimeTypeHandle.CreateInstance(RuntimeType类型下,布尔型publicOnly、布尔型noCheck、布尔& canBeCached、RuntimeMethodHandleInternal& ctor、布尔&bNeedSecurityCheck在System.RuntimeType.CreateInstanceSlow(布尔publicOnly、布尔skipCheckThis、布尔fillCache、StackCrawlMark& stackMark)的bNeedSecurityCheck publicOnly、布尔skipCheckThis、布尔fillCache、StackCrawlMark& stackMark)。 在C:\Source\User\MaLe\Tests\CSExeCOMServer\C#\ConsoleClient\Program.cs:line 17中,System.Activator.CreateInstance(类型类型,布尔型nonPublic)在System.Activator.CreateInstance(类型类型) at ConsoleClient.Program.Main(String[] args)在System.AppDomain._nExecuteAssembly(RuntimeAssembly程序集上,String[] args在System.AppDomain.ExecuteAssembly(String assemblyFile,Evidence,String[] args)在Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()上 在System.Threading.ThreadHelper.ThreadStart_Context(Object州) 在System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext,ContextCallback回调,对象状态,布尔preserveSyncCtx)在System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback回调,对象状态,布尔preserveSyncCtx)在System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback回调,Object状态)在System.Threading.ThreadHelper.ThreadStart()
如果我手动启动服务器exe并再次通过COM连接到它,我可以在任务管理器中看到客户端启动了第二台服务器,而不是连接到第一台服务器。这个服务器确实是64位的,但是异常会发生,在关闭客户端之后,第二个服务器也会关闭。如果我强迫服务器在AnyCPU中使用32位的Prefere 32位标记,一切都可以正常工作,但在32位。如果我将平台目标设置为x64,那么一切都可以在64位内正常工作。因此,如果它在64位内启动,它就不会只在AnyCPU配置中工作。
有人知道我做错了什么吗?我真的需要一个COM-服务器来运行在AnyCPU配置中,即使是64位。实际上,我不想分离32位和64位的exe。顺便说一句,这在我测试它时也起了作用。
谢谢你的帮助。
发布于 2017-02-03 15:16:13
有人知道我做错了什么吗?我真的需要一个COM-服务器来运行在AnyCPU配置中,即使是64位。我其实不想有分开32位和64位的执行。
COM需要为32位和64位以及两个不同的进程外COM服务器分别注册COM;因此,您需要一个32位的COM exe以及一个64位的exe。你不能两个人都要一个。
在任何地方都可以看到这样的例子:
想要32位客户端连接到64位服务器的唯一方法是添加适当的DCOM注册,并在另一个机器上运行服务器(运行Windows 64位),客户端通过网络连接到服务器。不过,这可能不是特别有用。
https://stackoverflow.com/questions/42027123
复制相似问题