我用 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
我需要做什么?