无法使用 Perl 中的 C# COM 对象

Unable to use C# COM object from Perl

我正在尝试创建一个要在 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 脚本都会得到输出 "Oops",所以它不可调用。但是,我可以成功实例化 "Excel.Application" 对象。我已经在 Visual Studio 项目设置中设置了 "Register for COM interop" 和 "Make assembly COM-Visible" 并且如上所述我已经单独使用 RegAsm 来尝试注册 dll。

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

谢谢。

如果有比 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 位 OS 上,cscript.exe 或 wscript.exe 的标准版本是 64 位程序。您可以使用 c:\windows\SysWOW64\wscript.exe(或 cscript.exe)尝试 运行 32 位版本。