Регистрация x64 COM Addin работает только для x86 Excel - PullRequest
0 голосов
/ 02 марта 2020

Я изо всех сил пытаюсь зарегистрировать библиотеку классов C#, которая будет использоваться в 64-битном Excel, и я проверил каждое пятно в inte rnet, говоря об этом до сих пор. Моя библиотека классов проста, имеет один метод (для тестов), который будет использоваться в качестве надстройки Excel.

1) Когда моя библиотека классов скомпилирована в AnyCPU, я вижу свой надстройку в реестре Windows, и он виден и работает нормально, но только для 32-битной версии Excel, и не виден для 64-битной Excel. Вот снимок экрана сгенерированных файлов реестра:

Снимок реестра, когда моя библиотека скомпилирована в AnyCPU

2) Когда моя библиотека классов скомпилирована в x64 (без каких-либо изменения в коде), я не вижу свой Addin в реестре Windows, это похоже на сбой регистрации или что-то. Вот скриншот того, что генерируется в реестре при компиляции в x64:

Скриншот реестра, когда моя библиотека компилируется в x64

Так что здесь вы можете видеть, что мой класс вообще не регистрируется, как при компиляции в AnyCPU.

Вот простой класс, который я использую, где вы можете проверить используемый код регистрации:

interface IAutomationAddin
{
    string GetTest();
}

[Guid("249618F9-A4A0-4999-9712-280D2A1493FB")]
[ClassInterface(ClassInterfaceType.AutoDual), ComVisible(true)]
public class AutomationAddin : IAutomationAddin
{
    #region Constructors

    public AutomationAddin()
    {

    }

    #endregion Constructors

    #region Initialization (Register/Unregister functions)

    /// <summary>
    /// Specifies the method to call when you register an assembly for use from COM; 
    /// this allows for the execution of user-written code during the registration process.
    /// </summary>
    /// <param name="type"></param>
    [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);
    }

    ///// <summary>
    ///// Specifies the method to call when you unregister an assembly for use from COM; 
    ///// this allows for the execution of user-written code during the unregistration process.
    ///// </summary>
    ///// <param name="type"></param>
    [ComUnregisterFunction]
    public static void UnregisterFunction(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.DeleteSubKey(s, false);
    }

    #endregion Initialization (Register/Unregister functions)

    public string GetTest()
    {
        return "x64 Simple Test";
    }
}

Я должен упомянуть, что " Регистрация для COM Interop »отмечена в моих настройках проекта (что очевидно, поскольку он работает для 32-битной версии).

Кто-нибудь знает, почему x64 не регистрируется? или почему AnyCPU регистрируется только для 32-битного Excel ??

...