【问题标题】:Possible to interact with a 64-bit COM server (Photoshop) from .NET?可以从 .NET 与 64 位 COM 服务器 (Photoshop) 交互吗?
【发布时间】:2011-08-23 21:25:05
【问题描述】:

我一直在尝试编写一些代码来与 Photoshop 交互,包括添加 COM 引用和后期绑定。我花了一段时间才意识到代码确实有效,但不适用于 64 位版本的 Photoshop。

我在 64 位 Photoshop 中遇到的异常如下:

COMException 未处理

检索 COM 类工厂 具有 CLSID 的组件 {D9389EDE-AEF8-4092-9377-075E94B7CB9A} 由于以下错误而失败: 80080005 服务器执行失败 (来自 HRESULT 的异常:0x80080005 (CO_E_SERVER_EXEC_FAILURE))。

我的应用程序是否可以与 64 位版本的 Photoshop 通信?还是仅限于与 32 位版本通信?

我在无数次尝试寻找解决方案时遇到了this,但我不知道如何将CLSCTX_ACTIVATE_64_BIT_SERVER 标志与COM 引用或后期绑定一起使用,嗯,假设它解决方案。

这里发生异常:

Type photoshopType = Type.GetTypeFromProgID("Photoshop.Application");
if (photoshopType != null)
{
    object photoshop = Activator.CreateInstance(photoshopType);

【问题讨论】:

  • 有一天我会弄清楚为什么 SO 用户断然拒绝记录他们得到的异常。我还没有接近那一天。将您的 EXE 项目的目标平台设置更改为任何 CPU。
  • 您的 Photoshop COM 对象是在进程中创建还是在进程外创建(相对于您的代码)?进程内需要构建到兼容平台的 .Net,进程外平台无关紧要。
  • 是的,拒绝。系统提示您,但仍然没有记录异常。没有得到答案是标准结果。
  • @a2h - 只有当人们提出不完整的问题时才会表现出来的态度。

标签: c# .net com photoshop


【解决方案1】:

如果标记为 AnyCPU,.NET 应用程序可执行文件 (.exe) 将始终在正在运行的处理器体系结构的本机位数中运行,它编译为 MSIL。因此,任何在 64 位平台上运行的 MSIL 程序集都将运行 64 位,而在 32 位平台上将运行 32 位。

在您的情况下,您可能希望为 AnyCPU 进行编译,但如果您必须强制使用 64 位互操作,请使用 x64。当然,这不适用于 32 位机器。这将从注册表的 64 位视图(包括 InProc

您还必须注意指针的编组方式。如果编写您自己的互操作代理,请务必使用 IntPtr 作为句柄。

【讨论】:

  • 未来读者:我终于拿到了 Visual Studio 2010 的副本;我一直在使用 Express,所以我无法选择 AnyCPU。这确实意味着不幸的是,没有任何答案可以证明我已验证可以为 Express 用户工作。随时为 Express 用户创建一个答案或指出一个已经存在的答案,我会记下它。
【解决方案2】:

在不同环境中使用 COM 需要检查的几件事:

  1. 切换 COM 引用的“嵌入互操作类型”(见图 1)
  2. 检查平台目标(见图 2)

【讨论】:

    【解决方案3】:

    从我们掌握的少量信息假设:

    引自:When CoCreateInstance returns 0x80080005 (CO_E_SERVER_EXEC_FAILURE)


    ... 如果客户端 调用 CoRegisterClassObject() 失败 从流程开始的那一刻起 开始,或未能调用 CoRegisterClassObjects() 给定的类工厂,然后 客户将收到 CO_E_SERVER_EXEC_FAILURE 错误 协同创建实例(...)。这可能发生 出于多种原因:

    1) 机器的 CPU 负载很高,并且 该过程需要很长时间才能开始 并执行 CoRegisterClassObjects() 小于 120 秒。

    2) COM 服务器没有注册 正确的类 ID。

    3) COM 服务器当前是 停止并且有比赛条件 CoCreateInstance 和 COM 之间 服务器停止部分。

    4) 存在安全问题 COM 服务器的启动方式(这 页面似乎提示拼写错误 密码或缺少“登录为 “运行方式..”的批处理作业”权限 COM 服务器,但无论如何我都会 建议重新验证此信息 为您的具体配置)

    【讨论】:

      【解决方案4】:

      我不太了解 Photoshop API,因此我将尝试更笼统地回答您的问题。

      32 位应用程序无法将 64 位代码加载到其地址空间中,反之亦然。这意味着混合它们的唯一方法是通过某种形式的进程间通信。

      如果 COM 是进程外 COM 服务器,COM 将为您处理此进程间通信。因此,如果 Photoshop COM 对象被实现为进程外对象,那么一切都会正常工作。由于它不适合您,我假设它们在不能在 32 位和 64 位之间混合的进程对象中使用。在这种情况下,您需要创建自己的进程外服务器来包装您要使用的 Photoshop 对象。然后,您可以从 32 位和 64 位代码中使用此进程外包装器。

      还要澄清一些其他帖子,在 .NET 中,您需要确保将平台目标设置为您想要完成的任务所需的内容。 x86 将使您的代码始终以 32 位运行。 x64 将使其始终以 64 位运行。任何 CPU 都会使其在 32 位操作系统上以 32 位运行,在 64 位操作系统上以 64 位运行。

      【讨论】:

        【解决方案5】:

        64/32 位版本的问题有点复杂,因为您可能在 32 位操作系统上运行 32 位 photoshop。 为了测试,我会尝试将项目目标设置为 x64,如果它可以运行 photoshop64,那么你甚至可以让你的代码编译两次(2 个 dll)并根据 photoshop 版本加载它们。

        【讨论】:

          【解决方案6】:

          转到组件服务>计算机>我的电脑>DCOM 配置>Photoshop RGBColor>身份>交互式用户。 并为管理员帐户设置安全选项卡权限

          【讨论】:

            猜你喜欢
            • 2011-09-10
            • 2010-10-27
            • 1970-01-01
            • 1970-01-01
            • 2010-09-22
            • 2016-07-16
            • 1970-01-01
            • 1970-01-01
            • 2011-10-04
            相关资源
            最近更新 更多