1

ActiveX のみをサポートするレガシー アプリケーション用に、C# でカスタム コントロールを作成しています。コントロールは他のアプリケーションでは正常に動作しますが、レガシー アプリケーションは「コントロール」と呼ばれるコンポーネント カテゴリのみをチェックし、「.NET カテゴリ」はチェックしないため、使用可能なコントロールのリストには表示されません。

regedit に移動し、以下のように「コントロール」カテゴリの GUID を実装済みカテゴリに手動で追加すると、レガシー アプリケーションはコントロールを見つけて問題なく挿入します。

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{XXXXXXX-XXXX-XXXX-XXXX-XXXXXXX}\Implemented Categories\{40FC6ED4-2438-11CF-A3DB-080036F12502}

私が疑問に思っているのは、ビルド中にそのようなカテゴリを自動的に追加する方法はありますか? 展開中に、エンジニアがレジストリにアクセスしてこのカテゴリを追加する必要はありません。レジストリ パッチを作成することが唯一の方法ですか?

Visual Studio プロジェクトを使用して、コントロールの展開用の .msi ファイルを作成しています。

4

1 に答える 1

2

ComRegisterFunctionAttributeを使用できます。これにより、任意の登録コードを追加できます。

using System;
using Microsoft.Win32;
using System.Runtime.InteropServices;
public class MyClassThatNeedsToRegister
{
   Guid categoryGuid = ...;

   [ComRegisterFunctionAttribute]
   public static void RegisterFunction(Type t)
   {
       RegistryKey key = Registry.ClassesRoot.CreateSubKey(
     "CLSID\\" + t.GUID.ToString("B") + 
     "\\Implemented Categories\\" + categoryGuid.ToString("B");
   }

   [ComUnregisterFunctionAttribute]
   public static void UnregisterFunction(Type t)
   {
      Registry.ClassesRoot.DeleteSubKey( "CLSID\\" + t.GUID.ToString("B") +
       "\\Implemented Categories\\" + categoryGuid.ToString("B"), false);
   }
}
于 2012-06-28T03:03:09.067 に答える