Я изо всех сил пытаюсь сделать надстройку COM C# видимой для x64 Microstf Excel (2019). До сих пор мой Надстройка видна только для Microsoft Excel x86, и никогда для Microsoft x64 Microsoft Excel.
Мой Addin (библиотека классов) скомпилирован в AnyCPU и очень прост c, я создал только один класс, с одной функцией, нет ссылок на сложные Dlls, мне просто нужно, чтобы он был виден для момент.
Я использую приведенный ниже код для регистрации COM:
[ComRegisterFunctionAttribute]
public static void RegisterFunction(Type type)
{
Registry.ClassesRoot.CreateSubKey(GetSubKeyName(type));
}
[ComUnregisterFunctionAttribute]
public static void UnregisterFunction(Type type)
{
Registry.ClassesRoot.DeleteSubKey(GetSubKeyName(type), false);
}
private static string GetSubKeyName(Type type)
{
string s = @"CLSID\{" + type.GUID.ToString().ToUpper() + @"}\Programmable";
Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.ClassesRoot.CreateSubKey("CLSID\\{" +
type.GUID.ToString().ToUpper() + "}\\InprocServer32");
if (key != null)
{
key.SetValue("", System.Environment.GetFolderPath(System.Environment.SpecialFolder.System) +
@"\mscoree.dll");
}
return s;
}
Приведенный выше код отлично работает для x86 Excel.
После выполняя свои исследования, я понял, что COM-надстройка должна быть зарегистрирована в x64 Regitry, чтобы быть видимой для x64 Excel, я использовал следующие строки для этого, но ничего не получалось:
// Version 1 : Registration to "Excel\\Addins" path
[ComRegisterFunction()]
private static void ComRegister(Type type)
{
string keyPath = "Software\\Microsoft\\Office\\Excel\\AddIns\\{" + type.GUID.ToString().ToUpper() + "}";
RegistryKey baseKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
RegistryKey key = baseKey.CreateSubKey(keyPath);
if (key != null)
key.SetValue("", System.Environment.GetFolderPath(System.Environment.SpecialFolder.System) + @"\mscoree.dll");
}
// Version 2 : Restration to "Wow6432Node"
[ComRegisterFunction]
public static void RegisterFunction(Type type)
{
string s = @"Wow6432Node\\CLSID\{" + type.GUID.ToString().ToUpper() + @"}\Programmable";
Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.ClassesRoot.CreateSubKey("Wow6432Node\\CLSID\\{" +
type.GUID.ToString().ToUpper() + "}\\InprocServer32");
if (key != null)
{
key.SetValue("", System.Environment.GetFolderPath(System.Environment.SpecialFolder.System) +
@"\mscoree.dll");
}
Registry.ClassesRoot.CreateSubKey(s);
}
Может кто-нибудь помочь мне сделать этот самый базовый c Надстройка работает для x64 Excel?
Заранее спасибо