Registering a .NET Plug-in

Windows Media Services plug-ins are COM objects. You can create a COM object in C# or Visual Basic .NET by using the GuidAttribute class to associate a GUID with the object that implements your plug-in. The GuidAttribute class is in the System.Runtime.InteropServices namespace.

Visual Basic .NET Example

Imports Microsoft.WindowsMediaServices.Interop
Imports System.Runtime.InteropServices
Imports Microsoft.Win32

<GuidAttribute("7DF709B2-3585-4201-BC50-4820ABE2BF18")> _
Public Class VBEventTest
    Implements IWMSBasicPlugin
    Implements IWMSEventNotificationPlugin

C# Example

using Microsoft.WindowsMediaServices.Interop;
using System.Runtime.InteropServices;
using Microsoft.Win32;

namespace CSEventTest
{

  [Guid("E1171A34-1F13-46d9-AA8A-63F47E92207C")]
  public class CSEventPlugin : IWMSBasicPlugin, 
                               IWMSEventNotificationPlugin
  {

When you build your plug-in, .NET creates an assembly with a .dll file name extension. If you use the Regasm.exe utility to register type information from the assembly, the following entries are added to the system registry.

HKEY_CLASSES_ROOT\progid
   (default) = progId

HKEY_CLASSES_ROOT\progid\CLSID
   (default) = clsid

HKEY_CLASSES_ROOT\CLSID\{clsid}
   (default) = progid

HKEY_CLASSES_ROOT\CLSID\{clsid}\InProcServer32
   (default) = %systemroot%\mscoree.dll
   Assembly = assembly name and version information
   Class = class name
   ThreadingModel = Both
   RuntimeVersion = version_of_the_runtime

HKEY_CLASSES_ROOT\CLSID\{clsid}\Implemented Categories\{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}

HKEY_CLASSES_ROOT\CLSID\{clsid}\ProgId
   (default) = progid

However, to enable Windows Media Services to recognize and use your plug-in, you must provide additional registry information. You can use the ComRegisterFunctionAttribute class to identify a registration function for Regasm.exe to call during the registration process. The following example creates subkeys in the and keys to add registry information needed by the server.HKEY_CLASSES_ROOTHKEY_LOCAL_MACHINE

Visual Basic .NET Example

<ComRegisterFunctionAttribute()> _
Shared Sub RegisterFunction(ByVal t As Type)
  Try
    Dim regHKLM As RegistryKey
    regHKLM = Registry.LocalMachine
    regHKLM = regHKLM.CreateSubKey("SOFTWARE\\Microsoft\\Windows Media\\Server\\RegisteredPlugins\\Event Notification and Authorization\\{7DF709B2-3585-4201-BC50-4820ABE2BF18}")
    regHKLM.SetValue(Nothing, "Sample VBEvent Notification")

    Dim regHKCR As RegistryKey
    regHKCR = Registry.ClassesRoot
    regHKCR = regHKCR.CreateSubKey("CLSID\\{7DF709B2-3585-4201-BC50-4820ABE2BF18}\\Properties")
    regHKCR.SetValue("Name", "Sample VBEvent Notification")
    regHKCR.SetValue("Author", "XYZ Corporation")
    regHKCR.SetValue("CopyRight", "Copyright 2002 . All rights reserved")
    regHKCR.SetValue("Description", "Enables you to trap the connect and disconnect events")

  Catch e As Exception
    MsgBox(e.Message, MsgBoxStyle.OKOnly)
  End Try
End Sub

C# Example

[ComRegisterFunctionAttribute]
public static void RegisterFunction(Type t)
{
  try
  {
    RegistryKey regHKLM = Registry.LocalMachine;
    regHKLM = regHKLM.CreateSubKey("SOFTWARE\\Microsoft\\Windows Media\\Server\\RegisteredPlugins\\Event Notification and Authorization\\{E1171A34-1F13-46d9-AA8A-63F47E92207C}");
    regHKLM.SetValue(null, "Sample CSEvent Notification");

    RegistryKey regHKCR = Registry.ClassesRoot;
    regHKCR = regHKCR.CreateSubKey("CLSID\\{E1171A34-1F13-46d9-AA8A-63F47E92207C}\\Properties");
    regHKCR.SetValue("Name", "Sample CSEvent Notification");
    regHKCR.SetValue("Author", "XYZ Corporation");
    regHKCR.SetValue("CopyRight", "Copyright 2002 . All rights reserved");
    regHKCR.SetValue("Description", "Event plug-in");
  }
  catch(Exception error)
  {
    MessageBox.Show(error.Message,
              "Inside RegisterFunction(). Cannot Register",
              MessageBoxButtons.OK,
              MessageBoxIcon.Error);
  }
}

It is recommended that you use the ComUnRegisterFuntionAttribute class to identify a registration function for Regasm.exe to call when an end user removes registry entries. This is illustrated by the following examples.

Visual Basic .NET Example

<ComUnregisterFunction()> _
Shared Sub UnRegisterFunction(ByVal t As Type)
  Try

    Dim regHKLM As RegistryKey
    regHKLM = Registry.LocalMachine
    regHKLM.DeleteSubKey("SOFTWARE\\Microsoft\\Windows Media\\Server\\RegisteredPlugins\\Event Notification and Authorization\\{7DF709B2-3585-4201-BC50-4820ABE2BF18}")

    Dim regHKCR As RegistryKey
    regHKCR = Registry.ClassesRoot
    regHKCR.DeleteSubKeyTree("CLSID\\{7DF709B2-3585-4201-BC50-4820ABE2BF18}")
    regHKCR.DeleteSubKeyTree("VBEventTest.VBEventPlugin")

  Catch e As Exception
    MsgBox(e.Message, MsgBoxStyle.OKOnly)
  End Try
End Sub

C# Example

[ComUnregisterFunctionAttribute]
public static void UnRegisterFunction(Type t)
{
  try
  {
    RegistryKey regHKLM = Registry.LocalMachine;
    regHKLM.DeleteSubKey("SOFTWARE\\Microsoft\\Windows Media\\Server\\RegisteredPlugins\\Event Notification and Authorization\\{E1171A34-1F13-46d9-AA8A-63F47E92207C}");

    RegistryKey regHKCR = Registry.ClassesRoot;
    regHKCR.DeleteSubKeyTree("CLSID\\{E1171A34-1F13-46d9-AA8A-63F47E92207C}");
    regHKCR.DeleteSubKeyTree("CSEventTest.CSEventPlugin");
  }
  catch(Exception error)
  {
    MessageBox.Show(error.Message,
                    "Cannot delete a subkey.",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Error);
  }
}

You can register the assembly manually or by using Visual Studio. To register the assembly manually, copy it to <%systemroot%>/system32/windows media/server, and run the Regasm.exe utility to register it and create a type library.

    regasm CSEventTest.dll /tlb

To register the assembly by using Visual Studio, in the Solution Explorer, right-click the name of the assembly and click Properties. In the property pages dialog box, click Configuration Properties and click Build. Change the Register for COM Interop property to true. This process automatically configures the system registry. Refresh the server so that it can recognize your plug-in.

To register your plug-in on a computer other than that on which it was built, copy the assembly to the <%systemroot%>/system32/windows media/server folder on that computer, and run the Regasm.exe utility to register it.

    regasm CSEventTest.dll

See Also

Concepts

Registering Plug-ins

Using C# to Create a Plug-in

Using Visual Basic .NET to Create a Plug-in