Как зарегистрировать Excel надстройку COM для использования в Microsoft x64 Microsoft Excel (2019) - PullRequest
0 голосов
/ 19 февраля 2020

Я изо всех сил пытаюсь сделать надстройку 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?

Заранее спасибо

...