2013-03-18 93 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,那麼就考慮編寫一個控制檯應用程序並運行它(如果需要,可以使用參數)。