【发布时间】: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以发现错误(可能包含有用的信息)。 -
谢谢,这绝对有很大帮助