Как правилно да регистрирате 32-битова добавка в x86 офис, работещ на 64-битов компютър?

Не мога да регистрирам COM .dll в моя офис.

ОС - 64-bit Windows 7;
Целевата рамка на dll е 4.0;
Office е 32-битов Word 2007 (x86 Word 2007)
Добавката задава ниско ниво на клавиатурата Hook и използва следните неуправляеми методи

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr GetModuleHandle(string lpModuleName);

    [DllImport("user32.dll", SetLastError = true)]
    private static extern bool UnhookWindowsHookEx(IntPtr hhk);

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr SetWindowsHookEx(int idHook, HookProcedure lpfn, IntPtr hMod, uint dwThreadId);

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);  

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr GetForegroundWindow();

По-долу са показани всички комбинации, които опитах. Бележки:

  • RegAsm 32 означава извършване на
    C:\Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe "my.dll" /codebase
  • RegAsm 64 означава извършване на
    C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe "my.dll" /codebase
  • Нормално (CU) означава
    HKEY_CURRENT_USER\Software\Microsoft\Office\Word\Addins\ProgID
  • WOW (CU) означава
    HKEY_CURRENT_USER\Software\Wow6432Node\Microsoft\Office\Word\Addins\ProgID
  • WOW (LM) означава
    HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\Word\Addins\ProgID
  • Запис в регистъра (WOW-CU,Normal-CU и WOW-LM) означава създаване на папка progID с Description,FriendlyName,LoadBehavior в подходяща директория на регистъра, която е кодирана по-горе
  • Изходът е изход на AddinSpy
  • Когато командата target cpu bitness!=RegAsm bitness RegAsm е неуспешна, няма да показвам такива очевидни записи в моя списък.

    1. target=32,regasm=32,регистър=WOW(CU),изход=няма изход. Word 2007 не вижда WOW-CU?

    2. target=x86-64,regasm=64,регистър=WOW(CU),изход=няма изход. Word 2007 не вижда WOW-CU?

    3. target=32,regasm=32,registry=Normal(CU),output=BadImageFormatException Но добавката работи!

    4. target=x86-64,regasm=64,registry=Normal(CU),output= Dll Path is not found.

    5. target=32,regasm=32,registry=WOW(LM),output=BadImageFormatException Но добавката работи!

    6. target=x86-64,regasm=64,регистър=WOW(LM),изход=BadImageFormatException

Чух, че Office 2007 не поддържа регистрация за всички потребители (локална машина), но изглежда, че поддържа, както показаха 5 и 6. Имам предвид Word може да види WOW възел на регистъра в LM. Напротив, възлите WOW6432 в Текущ потребител са игнорирани, както е показано в 1 и 2. Така че Word не може да види WOW възел в CU.

Как мога да регистрирам моята добавка? 3 и 5 го карат да работи, но `BadImageFormatException е толкова досаден, че искам да се отърва от него.


person Baurzhan    schedule 12.03.2014    source източник
comment
Всичките ви заключения са точни. Със сигурност никой не може да познае защо изключение за BadImageFormatException все пак ще позволи на добавка да работи, това не е youtube.com.   -  person Hans Passant    schedule 12.03.2014
comment
@HansPassant, забравих допълнение към BadImageFormatException - Тази сглобка е изградена от среда за изпълнение, по-нова от текущо заредената среда за изпълнение и не може да бъде заредена. Целевата рамка обаче е 4.0 и компютърът ми има инсталирана 4.0 Framework.   -  person Baurzhan    schedule 13.03.2014
comment
Word вече има зареден CLR, стара версия. Имате нужда от файл winword.exe.config, който принуждава CLR v4 да бъде зареден.   -  person Hans Passant    schedule 13.03.2014
comment
Не мога да намеря .config файл, търсих в моя компютър, но не успях да го намеря, опитах се да създам winword.exe.config близо до WINWORD.EXE, но след такова действие Word не може да стартира.   -  person Baurzhan    schedule 13.03.2014