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