【问题标题】:Unable to use C# COM object from Perl无法从 Perl 使用 C# COM 对象
【发布时间】:2023-04-05 06:02:01
【问题描述】:

我正在尝试创建一个用于 Perl 脚本的 C# COM 对象(据我所知,COM 是最好的方法)。

这是 C# 代码:

using System.Runtime.InteropServices;

namespace ExampleCom
{
    [Guid("EAA4976A-45C3-4BC5-BC0B-E474F4C3C83F")]
    public interface IComClass
    {

    }

    [Guid("7BD20046-DF8C-44A6-8F6B-687FAA26FA71")]
    [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    public interface IComClassEvents
    {

    }

    [Guid("0D53A3E8-E51A-49C7-944E-E72A2064F938")]
    [ClassInterface(ClassInterfaceType.None)]
    [ComSourceInterfaces(typeof(IComClassEvents))]
    [ProgId("ExampleCom.ComClass")]
    public class ComClass : IComClass
    {
    }
}

这是 RegAsm 的输出:

Microsoft .NET Framework Assembly Registration Utility version 4.0.30319.0
for Microsoft .NET Framework version 4.0.30319.0
Copyright (C) Microsoft Corporation.  All rights reserved.

RegAsm : warning RA0000 : Registering an unsigned assembly with /codebase can ca
use your assembly to interfere with other applications that may be installed on
the same computer. The /codebase switch is intended to be used only with signed
assemblies. Please give your assembly a strong name and re-register it.
Types registered successfully

最后是 perl 脚本:

use Win32::OLE;
$ex = Win32::OLE->new('ExampleCom.ComClass') or die "oops\n";
print $ex;

不幸的是,每次我运行 Perl 脚本时,我都会得到输出“糟糕”,所以它是不可调用的。但是,我可以成功实例化“Excel.Application”对象。我在 Visual Studio 项目设置中设置了“Register for COM interop”和“Make assembly COM-Visible”,如上所述,我已经分别使用 RegAsm 来尝试注册 dll。

有没有人可以在这里分享经验,指出正确的方向或告诉我哪里出错了?

谢谢。

【问题讨论】:

  • $Win32::OLE::Warn = 3 设置为Win32::OLE 以发现错误(可能包含有用的信息)。
  • 谢谢,这绝对有很大帮助

标签: c# perl com ole


【解决方案1】:

这将有助于获得比 oops 更有用的调试消息。我建议编写一个 vbscript 程序来提供更有用的信息。

您运行的 Perl 版本是 32 位还是 64 位?如果它是 64 位,那么您的程序将失败,因为进程内服务器(DLL OLE 服务器)必须具有与其客户端相同的位数。如果是这种情况,那么您需要运行 64 位版本的 regasm,它将位于 Framework64 目录而不是 Framework 目录中。

Excel 会成功,因为它是进程外服务器,并且位数不需要匹配——当然位数可能匹配。

一个简单的vbscript程序是:

Dim obj
Set obj = CreateObject("ExampleCom.ComClass")
MsgBox TypeName(obj)

在 64 位操作系统上,标准版本的 cscript.exe 或 wscript.exe 是 64 位程序。您可以尝试使用 c:\windows\SysWOW64\wscript.exe(或 cscript.exe)运行 32 位版本。

【讨论】:

  • 原来我的 dll 是为 32 位构建的,而 Perl 是 64 位的。在 SysWOW64 文件夹中使用 wscript/cscript 运行脚本帮助我找到了这一点。谢谢你,原谅我糟糕的 Perl 技能(我不是 Perl 开发者,哈哈)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-05
  • 2011-05-16
  • 2011-10-29
  • 2019-10-19
  • 2012-01-26
  • 2011-06-07
  • 2014-09-20
相关资源
最近更新 更多