可以从.NET与64位COM服务器(Photoshop)进行交互吗?

时间:2011-05-12 07:14:37

标签: c# .net com photoshop

我一直在尝试编写一些与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);

6 个答案:

答案 0 :(得分:1)

要检查从/到不同环境使用COM的一些事情:

  1. 切换COM参考的“嵌入互操作类型”(参见图像1)
  2. 检查平台目标(见图2)
  3. Image 1 - Reference Property Image 2 - Platform Target

答案 1 :(得分:1)

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

在你的情况下,你要么想要为AnyCPU编译,但如果你必须强制64位互操作使用x64。当然,这不适用于32位机器。这将从注册表的64位视图本身读取(包括InProc

您还必须小心如何编组指针。如果编写自己的互操作代理,请务必使用IntPtr for handle。

答案 2 :(得分:0)

假设我们提供的信息很少:

  

引自:When CoCreateInstance returns 0x80080005 (CO_E_SERVER_EXEC_FAILURE)

     
     

...如果是客户   无法调用CoRegisterClassObject()   从过程的那一刻起   开始,或没有打电话   完全是CoRegisterClassObjects()   给定的类工厂,然后是   客户将收到   CO_E_SERVER_EXEC_FAILURE错误   CoCreateInstance的(......)。这可能发生   出于各种原因:

     

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

     

2)COM服务器未注册   正确的班级ID。

     

3)COM服务器当前   停止并且有竞争条件   在CoCreateInstance和COM之间   服务器停止部分。

     

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

答案 3 :(得分:0)

我对Photoshop API并不多,所以我会尝试更一般地回答你的问题。

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

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

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

转到组件服务>计算机>“我的电脑”>“ DCOM配置”> Photoshop RGBColor>“身份”>交互式用户。 并在安全标签上设置管理员帐户的权限