1

我刚刚发现我可以在 c# 中编写我需要的功能,然后将其作为一个 com 库在 inno setup 中调用它。下面是我正在玩的代码。

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);

代码编译得很好,但是当我运行设置时,我收到消息“类未注册”。错误来自哪里,可能的出路是什么?

4

2 回答 2

1

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

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

不要忘记在安装完成时(包括未成功完成时)再次取消注册该组件。

就个人而言,我不会这样做——临时 COM 注册非常混乱。理想情况下,为设置任务编写本机 DLL(或者直接在 Inno 脚本中执行,如果您正在执行简单的操作,例如写入文件)。如果您出于某种原因肯定需要 .NET,那么请考虑编写一个控制台应用程序并运行它(如果需要,使用参数)。

于 2013-03-18T18:14:58.543 回答
0

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

如果您不将程序集放入 GAC(这需要您对其进行签名),则需要regasm使用/codebaseswitch 运行,以便注册表包含程序集的位置。我通常/tlb也会添加 switch,因为我喜欢有可用的类型库,并且在某些编组场景中可能需要它。

于 2013-03-18T09:50:24.297 回答