Как зарегистрировать расширение пространства имен, написанное на C #, в реестре Vista - PullRequest
4 голосов
/ 09 марта 2010

Доброе утро всем,

После дня поиска в Google я в растерянности. Я решил прийти сюда и спросить сообщество. Я нахожусь в процессе создания расширения пространства имен для Vista в C #. Теперь я понимаю, что MS говорит не делать этого, но я просто делаю это как доказательство концепции.

Проблема: мне не хватает знаний и понимания, чтобы выяснить, как зарегистрировать мое расширение пространства имен .NET в реестре Windows.

Из моего прочтения я считаю, что этот пост ([] Как разместить расширение корневого пространства имен в проводнике Windows ) объясняет, где находится ключ, но нужны ли внутри него подключи и / или значения? 1009 *

Я понимаю, что regsvr32 и / или regasm.exe необходимо использовать для регистрации моей dll (не уверен, какой, я нашел противоречивый совет).

Я также понимаю, что моя DLL должна иметь метод, подобный следующему:

(Этот код в основном происходит от [] http://msdn.microsoft.com/en-us/magazine/cc188741.aspx, незначительных изменений для добавления в правильное расположение реестра)

[ComRegisterFunctionAttribute]
public static void RegisterFunction(Type t)
{

try 
{
    // add the correct things to the CLSID so the thing works as an extension
    RegistryKey CLSID = Registry.ClassesRoot.OpenSubKey("CLSID");

    RegistryKey kClass = null;

    kClass = CLSID.OpenSubKey( "{" + t.GUID.ToString() + "}", true );

    RegistryKey ProgId = kClass.OpenSubKey("ProgId");

    kClass.SetValue( null, (string) ProgId.GetValue(null) );

    ProgId.Close();

    RegistryKey ShellFolder = kClass.CreateSubKey("ShellFolder");

    ShellFolder.SetValue( "Attributes", 0x78000040 );
    ShellFolder.SetValue( "WantsFORPARSING", "" );

    ShellFolder.Close();
    kClass.Close();
    CLSID.Close();

    // add it to the approved list of extensions
          RegistryKey MyComputer = Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace", true);

          MyComputer.SetValue("{" + t.GUID.ToString() + "}", t.FullName);
          MyComputer.Close();
}
catch( Exception e ) 
{
    MessageBox.Show( e.Message );
    return;
}
}

Ресурсы для людей, которые в этой ситуации в будущем найдут это, выполнив поиск [] http://msdn.microsoft.com/en-us/magazine/cc188741.aspx

[] http://msdn.microsoft.com/en-us/library/bb762774(VS.85).aspx

[] Как разместить расширение корневого пространства имен в проводнике Windows

--- Обновление от 3/10/10 ---

Я пытался поработать с ним, но все равно безуспешно. Поэтому я вырвал все, что у меня было, чтобы выяснить, как на самом деле работает регазм с реестром.

Мой код:

using System;
using Microsoft.Win32;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace Test2
{
[ProgId("Test2")]
[Guid("1149E580-186E-4f8c-AB6A-E55D6F0F171E")]
[ComVisible(true)]
public class Class1
{
    [ComRegisterFunctionAttribute()]
    public static void RegisterFunction(Type t)
    {
        // add the correct things to the CLSID so the thing works as an extension

        System.IO.FileStream fs = new System.IO.FileStream(@"C:\Users\Lucas\Documents\Visual Studio 2010\Projects\Test2\Test2\bin\Release\Test2.txt",
            System.IO.FileMode.Create, System.IO.FileAccess.ReadWrite, System.IO.FileShare.None);

        fs.Write(System.Text.Encoding.ASCII.GetBytes("Running RegisterFunction"), 0, 0);
        fs.Close();

        RegistryKey CLSID = Registry.ClassesRoot.OpenSubKey("CLSID");

        RegistryKey kClass = CLSID.CreateSubKey("{" + t.GUID.ToString() + "}");

        kClass.SetValue("Test", "HelloRegistry", RegistryValueKind.String);

        kClass.Close();
        CLSID.Close();
    }

    [ComUnregisterFunctionAttribute()]
    public static void UnregisterFunction(Type t)
    {
    }
}
}

Я создаю dll, затем запускаю regasm / regfile [: pathtofile] [pathtodll], и сгенерированный файл реестра выглядит следующим образом:

REGEDIT4

[HKEY_CLASSES_ROOT\Test2]
@="Test2.Class1"

[HKEY_CLASSES_ROOT\Test2\CLSID]
@="{1149E580-186E-4F8C-AB6A-E55D6F0F171E}"

[HKEY_CLASSES_ROOT\CLSID\{1149E580-186E-4F8C-AB6A-E55D6F0F171E}]
@="Test2.Class1"

[HKEY_CLASSES_ROOT\CLSID\{1149E580-186E-4F8C-AB6A-E55D6F0F171E}\InprocServer32]
@="mscoree.dll"
"ThreadingModel"="Both"
"Class"="Test2.Class1"
"Assembly"="Test2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
"RuntimeVersion"="v4.0.21006"

[HKEY_CLASSES_ROOT\CLSID\{1149E580-186E-4F8C-AB6A-E55D6F0F171E}\InprocServer32\1.0.0.0]
"Class"="Test2.Class1"
"Assembly"="Test2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
"RuntimeVersion"="v4.0.21006"

[HKEY_CLASSES_ROOT\CLSID\{1149E580-186E-4F8C-AB6A-E55D6F0F171E}\ProgId]
@="Test2"

[HKEY_CLASSES_ROOT\CLSID\{1149E580-186E-4F8C-AB6A-E55D6F0F171E}\Implemented Categories\{62C8FE65-4EBB-45E7-B440-6E39B2CDBF29}]

Обратите внимание, что ничего о моем пользовательском ключе и текстовом документе никогда не создается. Так что это наводит меня на мысль, что regasm никогда не вызывает мой пользовательский метод регистрации. Если у кого-нибудь есть идеи, я буду более чем счастлив их попробовать!

1 Ответ

2 голосов
/ 09 марта 2010
  1. Вам нужно запустить regasm.exe, а не regsvr32.exe
  2. Вам необходимо убедиться, что вы зарегистрировались, работая от имени администратора.
  3. Наконец, вам также необходимо создатьследующий раздел реестра HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\Namespace\{CLSID of your root class} и установите значение по умолчанию для отображаемого имени вашего расширения пространства имен.Предполагается, что вы регистрируетесь в разделе «Мой компьютер».
  4. Добавьте его к утвержденным расширениям в следующем разделе реестра: HKLM\Software\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved.Для этого ключа создайте новое значение, имя которого равно CLSID вашего расширения пространства имен, а значение равно отображаемому имени вашего расширения пространства имен.
...