gpt4 book ai didi

c# - 如何启动 AnyCPU 编译的 COM 服务器

转载 作者:太空宇宙 更新时间:2023-11-03 12:32:54 26 4
gpt4 key购买 nike

我使用 Microsoft 的 COM 服务器示例: Out-of-process C# COM server (CSExeCOMServer)

一个简单的控制台 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 位运行。注册在服务器的构建后事件中完成。所以我更改了注册(使用 Framework64 regasm.exe),这样服务器也将以 64 位注册。然后我将平台目标更改为 AnyCPU。如果我现在启动客户端,它会挂起

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

但我可以在任务管理器中看到服务器已在 64 位中正确启动。大约 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()

如果我手动启动服务器 exe 并再次尝试通过 COM 连接到它,我可以在任务管理器中看到客户端启动了第二个服务器,而不是连接到第一个服务器。这个确实是 64 位的,但是发生了异常,在关闭客户端后,第二个服务器也关闭了。如果我在带有 Prefere 32 位标志的 AnyCPU 中强制服务器为 32 位,一切正常,但在 32 位中。如果我将平台目标设置为 x64,那么在 64 位中也一切正常。因此,如果它以 64 位启动,它仅适用于 AnyCPU 配置。

有人知道我做错了什么吗?我真的需要一个 COM 服务器在 AnyCPU 配置中运行,即使是 64 位。我实际上不想有单独的 32 位和 64 位 exe。顺便说一句,当我测试它时,它也起作用了。

感谢您的帮助。

最佳答案

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 资源管理器的 shell 扩展的特定位版本。例如TortoiseSVN; TortoiseGit。在 64 位 Windows 上运行的 Windows 资源管理器只接受 64 位扩展;同样适用于在 32 位 Windows 上运行

  • Microsoft Office 的 32 位和 64 位版本(现在已经是 COM/Ole 一段时间了),COM 加载项的位数相同

可能能够绕过想要将 32 位客户端连接到 64 位服务器的唯一方法是,如果您添加适当的 DCOM 注册并在另一个机器上运行您的服务器(运行 Windows 64 位),您的客户端通过网络连接到它。不过,这可能不是特别有用。

关于c# - 如何启动 AnyCPU 编译的 COM 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42027123/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com