Ошибка 429 компонент ActiveX не может создать объект при использовании ссылки самостоятельного создания - PullRequest
0 голосов
/ 30 мая 2018

Я создал несколько надстроек для Excel в C #.В нем есть один публичный класс для использования в VBA.На моей машине все работает нормально.Когда я устанавливаю надстройку на компьютер-тестер (я использую InstallShield 2015 Limited Edition для Visual Studio для создания установочного файла), я не могу установить объект.

C # код

using System;
using Excel = Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;
using Microsoft.Win32;

namespace PMTAddin
{
    [Guid("B2350EC1-522E-4B75-BB02-86BB0FD1A60E")]
    [ClassInterface(ClassInterfaceType.AutoDual)]
    [ComVisible(true)]
    public class PublicClass
    {
        public void test()
        {
            System.Windows.Forms.MessageBox.Show(
                        "test."
                    , "test"
                    , System.Windows.Forms.MessageBoxButtons.OK
                    , System.Windows.Forms.MessageBoxIcon.Error
                );
        }

        private int GetWorksheetID(Excel.Workbook wb, string worksheetName)
        {
            int result = 0;


            foreach (Excel.Worksheet ws in wb.Worksheets)
            {
                if (ws.Name == worksheetName)
                {
                    result = ws.Index;
                    break;
                }

            }

            return result;
        }

        [ComRegisterFunctionAttribute]
        public static void RegisterFunction(Type type)
        {
            Registry.ClassesRoot.CreateSubKey(GetSubKeyName(type, "Programmable"));
            RegistryKey key = Registry.ClassesRoot.OpenSubKey(GetSubKeyName(type, "InprocServer32"), true);
            key.SetValue("", System.Environment.SystemDirectory + @"\mscoree.dll", RegistryValueKind.String);
        }

        [ComUnregisterFunctionAttribute]
        public static void UnregisterFunction(Type type)
        {
            Registry.ClassesRoot.DeleteSubKey(GetSubKeyName(type, "Programmable"), false);
        }

        private static string GetSubKeyName(Type type, string subKeyName)
        {
            System.Text.StringBuilder s = new System.Text.StringBuilder();
            s.Append(@"CLSID\{");
            s.Append(type.GUID.ToString().ToUpper());
            s.Append(@"}\");
            s.Append(subKeyName);
            return s.ToString();
        }
    }
}

В проекте VBA я проверил ссылку на него в списке.Он вызывает PMT.

VBA

Sub dsf()
    Dim o As PMT.PublicClass
    Set o = New PMT.PublicClass 'at this lane on other computer I got error 429. On my computer all work smoothly and method test is running.

    o.test
End Sub

Я думал, что это может быть что-то .NET Framework, но оно установлено.Есть идеи?

РЕДАКТИРОВАТЬ:

Я создаю две разные версии для bittnes, но с той же ошибкой.

Но я нашел новую информацию.В реестре на моем компьютере это выглядит так Registry on dev machine

, а на тестере это выглядит так Registry on test machine

НетЗначение CodeBase ... Как вы думаете, это проблема?Если это так, как мне нужно изменить метод RegisterFunction, чтобы исправить это?

1 Ответ

0 голосов
/ 18 июня 2018

После долгих поисков я нашел решение.Это отчасти, потому что для 64-битного Excel нам нужно зарегистрировать библиотеку вручную (может кто-то знает, как добавить bat-файл в установочный файл).

Я нашел ответ на этом сайте .

При создании установочного файла Install Shield нам нужно сделать две вещи.

  1. Add.файл tlb в файлы приложения (этот шаг был сделан мной до публикации в stackoverflow)
  2. Щелкните правой кнопкой мыши на проекте. Первичный выходной файл и выберите свойства, как на скриншоте (для файла * .tlb мы должны проверить то же самое, но без "COM Interop") enter image description here

Без этого установщик не будет правильно регистрировать надстройку в реестре.

Установочный файл, созданный следующим образом, регистрирует надстройку только для 32-bit excel .Если вы хотите использовать его также в 64-битном Excel, вам нужно зарегистрировать библиотеку вручную.Я создал простой bat-файл, подобный этому:

c:
cd C:\Windows\Microsoft.NET\Framework64\v4.0.30319
regasm.exe "[pathToDLL]\AddInName.dll" /tlb:"[pathToDLL]\AddInName.tlb" /codebase 
pause

Помните, что вам нужно запустить его с правами администратора.

...