0

我正在为 Navision 2009 SP1(经典客户端)开发一份报告,其中出现了对 NAV 中不可用的额外功能的需求。

我在 C# 中创建了一个 COM dll,安装了它(使用 InstallShield“免费”vs 版本)并在 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 客户端配置文件(3.5 和 4.0),这意味着 Regasm 可用(在 4.0 中)而 gacutil 不可用。

我假设我的代码有问题而不是 InstallShield,因为 dll 可用于在 Navision 中选择,并且当我尝试创建 nav 自动化变量时会出现问题。

最好的问候马库斯

4

1 回答 1

0

好的,所以上面的代码没有任何问题,显然 Visual Studio 也有一个安装工具集。

我创建了一个新的解决方案,重新创建了库项目并添加了 VS 安装程序项目而不是 InstallShield 项目。我确保库程序集是强签名的,并将我生成的 TLB 文件添加到安装程序项目的“文件系统”中。安装程序项目会自动将 TLB 文件注册为依赖项,因此之后可以从“文件系统”中删除 TLB 文件。

通过该设置,我能够为 COM 互操作正确注册 DLL。

所以要记住的关键点是:

  • 如果你的设置和我一样(接口和类),请确保它们都是 ComVisible 和公共的。此外,它们需要具有匹配的名称,例如“IPrinterTest”和“PrinterTest”。
  • 确保程序集是强签名的。
  • 您必须为 DLL 生成 TLB 文件并将其添加到安装程序“FileSystem”中。

稍后我将使用详细说明整个过程的博客文章来编辑此答案。

于 2017-03-21T13:04:10.453 回答