如何注册在c#中创建的com类在运行inno setup时

本文关键字:com 运行 setup inno 创建 何注册 注册 | 更新日期: 2023-09-27 18:04:21

我刚刚发现我可以在c#中编写我需要的功能,然后使其成为一个com库,以便在inno设置中调用它。下面是我正在使用的代码:

c#代码:

namespace SetupUtility
{
[Guid("BC45B534-C9E7-4C43-B57C-56B77C1C6CEE")]
public interface IMyClass
{
    void WriteToFile(string filepath, string name, string orgName, string emailID);
}
 [Guid("9AB25B08-FF74-4ADA-9A16-62ADB4603A56"),
    ClassInterface(ClassInterfaceType.None)]
public class MyClass:IMyClass
{
    public void WriteToFile(string filepath,string name, string orgName, string emailID)
    {
        try
        {
            string[] strings = { name, orgName, emailID };
            File.WriteAllLines(filepath + "userDetails.txt", strings);
            MessageBox.Show("File Written Successfully");
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error: " + ex.ToString());
        }
    }
}

}

下面是我花了很多精力编写的pascal脚本的摘录:

ExtractTemporaryFile('SetupUtility.dll');
Exec('{dotnet40}'regasm.exe','{tmp}'SetupUtility.dll', '', SW_SHOW,
 ewWaitUntilTerminated, ResultCode);
obj := CreateOleObject('SetupUtility.MyClass');
obj.WriteToFile('{tmp}',ContactPerson, OrgName, Email);

代码编译得很好,但是当我运行设置时,我得到消息"类未注册"。错误从何而来,可能的解决方法是什么?

如何注册在c#中创建的com类在运行inno setup时

在代码中使用{dotnet40}{tmp}等常量时需要调用ExpandConstant

你需要[assembly:ComVisible(true)]在你的AssemblyInfo.cs文件。

不要忘记在安装完成后(包括安装失败时)再次注销该组件。

就我个人而言,我不会这样做——临时COM注册非常混乱。理想情况下,为设置任务编写一个本机DLL(或者直接在Inno脚本中完成,如果您正在做一些简单的事情,比如写入文件)。如果出于某种原因你确实需要。net,那么考虑编写一个控制台应用程序并运行它(如果需要,可以带参数)。

您应该首先用COMVisible属性标记您的类型。查看客户端代码(创建实例的代码)也会很有用。

如果您没有将程序集放入GAC(这需要您签名),则需要使用/codebase开关运行regasm,以便注册表包含程序集的位置。我通常也添加/tlb开关,因为我喜欢有可用的类型库,您可能需要它用于某些封送场景。