Доброе утро всем,
После дня поиска в 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 никогда не вызывает мой пользовательский метод регистрации. Если у кого-нибудь есть идеи, я буду более чем счастлив их попробовать!