如何注册在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);
代码编译得很好,但是当我运行设置时,我得到消息"类未注册"。错误从何而来,可能的解决方法是什么?
在代码中使用{dotnet40}
和{tmp}
等常量时需要调用ExpandConstant
你需要[assembly:ComVisible(true)]
在你的AssemblyInfo.cs文件。
不要忘记在安装完成后(包括安装失败时)再次注销该组件。
就我个人而言,我不会这样做——临时COM注册非常混乱。理想情况下,为设置任务编写一个本机DLL(或者直接在Inno脚本中完成,如果您正在做一些简单的事情,比如写入文件)。如果出于某种原因你确实需要。net,那么考虑编写一个控制台应用程序并运行它(如果需要,可以带参数)。
您应该首先用COMVisible
属性标记您的类型。查看客户端代码(创建实例的代码)也会很有用。
如果您没有将程序集放入GAC(这需要您签名),则需要使用/codebase
开关运行regasm
,以便注册表包含程序集的位置。我通常也添加/tlb
开关,因为我喜欢有可用的类型库,您可能需要它用于某些封送场景。