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 и добавить его в установщик "Файловая система".
Я отредактирую этот ответ позже с сообщением в блоге, детализирующем весь процесс.