0

我用 C# 编写了一个类并将其标记为 ComVisible。我将其上传到客户的计算机并使用 RegAsm 进行了注册。但是当我尝试从 Python 脚本中使用它时,我收到一条错误消息“系统找不到指定的文件”。如果我用“ThisDoesNotExist.ReportEngine”替换类的名称,错误消息是“无效的类字符串”,这是我所期望的。因此,Python 脚本似乎在注册表中找到了类名(“CrystalReportsRT2.ReportEngine”,以防万一),但找不到包含该类的 DLL 文件。

如果我使用的是老式 COM 对象,我可以在注册表中找到类名,记下它的 CLSID,找到该 CLSID 的注册表项,以及来自 InProcServer32 键的文件名。但是对于使用 RegAsm 注册的类,InProcServer32 键只包含类名和其他程序集信息。如何找出正在查找的文件以便验证它的存在?还是我必须将程序集添加到全局程序集缓存中?

我试图让现有库的修改版本工作。我决定尝试一个全新的图书馆。我试过这个:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace RegAsmTest
{
    [Guid("E476213F-1D62-408C-B89E-D9A8B4814CE1")]
    [ComVisible(true)]
    public interface ITest
    {
        int DoSomething(int input);
    }

    [Guid("C1E26B60-7D25-4EFE-80E9-F958024E22ED")]
    [ClassInterface(ClassInterfaceType.AutoDual)]
    [ComVisible(true)]
    [ProgId("RegAsmTest.Test")]
    public class Test : ITest
    {
        public int DoSomething(int input)
        {
            MessageBox.Show(string.Format("Input was {}", input));
            return input;
        }
    }
}

我尝试从 Python 中使用它:

import win32com.client

try:
    TestObject = win32com.client.Dispatch("RegAsmTest.Test")
    print ("Object created.")
except Exception as ex:
    print ("Failed to create object: " + str(ex))

起初我得到“班级未注册”。我检查了是否检查了“注册 COM 互操作”,但我没有。我检查了它。我又犯了一个错误。(对不起,但我忘记了哪个。)我尝试使用 /tlb 运行 RegAsm,但我得到“系统找不到指定的文件”。我尝试取消注册该库,并在我期望“类未注册”的地方得到“无效的类字符串”。我尝试在没有 /tlb 的情况下重新注册,并得到“系统找不到指定的文件”。

所以,我遇到了三个不同的错误,我不知道是什么操作顺序或错过的操作导致它们: Class not registered Invalid class string System cannot find the file specified

我需要做什么?

4

0 回答 0