1

必要な機能を 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());
        }
    }
}

}

以下は、私が苦労して書いたパスカル スクリプトからの抜粋です。

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

コード内からやのExpandConstantような定数を使用する場合は、呼び出す必要があります。{dotnet40}{tmp}

[assembly:ComVisible(true)]そして、AssemblyInfo.cs ファイルが必要です。

インストールが完了したら (失敗した場合も含めて)、このコンポーネントを再度登録解除することを忘れないでください。

個人的には、この方法は使いません。一時的な COM 登録は非常に面倒です。理想的には、セットアップ タスク用のネイティブ DLL を記述します (または、ファイルへの書き込みなどの単純なことを行う場合は、Inno スクリプトで直接行います)。何らかの理由で .NET がどうしても必要な場合は、代わりにコンソール アプリケーションを作成して実行することを検討してください (必要な場合はパラメーターを使用)。

于 2013-03-18T18:14:58.543 に答える
0

COMVisible最初に属性でタイプをマークする必要があります。クライアント側のコード(インスタンスを作成するコード)を確認することも役立ちます。

アセンブリをGACに配置しない場合(署名が必要)、レジストリにアセンブリの場所が含まれるように、スイッチregasmを使用して実行する必要があります。タイプライブラリを利用できるようにしたいので、/codebase通常はスイッチも追加します。マーシャリングのシナリオでは、スイッチが必要になる場合があります。/tlb

于 2013-03-18T09:50:24.297 に答える