2013-03-18 88 views
1

我刚刚发现我可以在c#中编写我需要的功能,然后使其成为一个com库以在inno setup中调用它。以下是我正在玩的代码。如何在运行inno setup时注册在c#中创建的com类

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

的代码编译罚款,但当我运行安装程序时,我收到消息“类未注册”。错误来自哪里以及可能的出路是什么?

+0

您是否确认可以通过其编译机器上的COM客户端创建这些类?您可能还需要'/ codebase'参数。 – Deanna 2013-03-18 10:37:49

+0

什么都没有跳出来,一个位的问题并不能解释它。使用SysInternals的ProcMon实用工具找出缺少什么注册表项。并确保你有一个regasm.exe实际执行的最低保证。 – 2013-03-18 13:13:40

回答

0

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

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

1

当您在代码中使用常量(如{dotnet40}{tmp})时,您需要致电ExpandConstant

而您需要在AssemblyInfo.cs文件中使用[assembly:ComVisible(true)]

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

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