Navision C/AL Создать ошибку с C# COM DLL

Я занимаюсь разработкой отчета для Navision 2009 SP1 (классический клиент), в котором возникла необходимость в дополнительных функциях, недоступных в NAV.

Я создал COM dll в C#, установил его (используя "бесплатную" версию InstallShield против версии) и создал переменную автоматизации в NAV. Класс и интерфейс видимы, и я вижу метод Print, но когда я пытаюсь СОЗДАТЬ переменную, я получаю следующую ошибку:

"Не удалось создать экземпляр сервера управления OLE или сервера автоматизации, идентифицируемый..... Проверьте, что сервер управления OLE или сервер автоматизации автоматически установлены и зарегистрированы".

Это код (просто пытаюсь установить соединение):

[ComVisible(true), Guid("080a97fb-321c-4a2f-b948-dd52ce263415"), InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IPrinterTest
{
    [DispId(1)]
    bool Print(string test, string bytesInStringRepresentation);
}

[ClassInterface(ClassInterfaceType.None), ComVisible(true), Guid("8d7b85a9-1a20-4ea0-a7d4-decf26632eee"), ProgId("Printer.PrinterTest")]
public class PrinterTest : IPrinterTest
{
    public PrinterTest()
    {

    }

    public bool Print(string test, string bytesInStringRepresentation)
    {
        return true;
    }
}

Производственная среда имеет только.NET Framework Client Profile (3.5 и 4.0), это означает, что Regasm доступен (в 4.0), а gacutil - нет.

Я предполагаю, что что-то не так с моим кодом, а не с InstallShield, поскольку dll доступна для выбора в Navision,- и проблема возникает, когда я пытаюсь создать переменную автоматизации nav.

С наилучшими пожеланиями Маркус

1 ответ

Решение

Итак, в приведенном выше коде нет ничего плохого, и, очевидно, Visual Studio также имеет набор инструментов для установки.

Я создал новое решение, заново создал проект библиотеки и добавил проект установщика VS вместо InstallShield. Я убедился, что сборка библиотеки имеет строгую подпись, и добавил файл TLB, который я сгенерировал, в "FileSystem" в проекте установщика. Проект установщика автоматически зарегистрирует файл TLB как зависимость, поэтому файл TLB может быть впоследствии удален из "Файловой системы".

С этой настройкой я смог правильно зарегистрировать DLL для COM-взаимодействия.

Итак, ключевые моменты, которые нужно помнить:

  • Если у вас те же настройки, что и у меня (интерфейс и класс), убедитесь, что они оба ComVisible и общедоступны. Кроме того, они должны иметь совпадающие имена, например, "IPrinterTest" и "PrinterTest".
  • Убедитесь, что сборка подписана.
  • Вы должны сгенерировать файл TLB для библиотеки DLL и добавить его в установщик "Файловая система".

Я отредактирую этот ответ позже с сообщением в блоге, детализирующем весь процесс.

Другие вопросы по тегам