visual-studio-2010 - 未注册库时,无法使用引用的TLB编译.NET应用程序

我有一个C#4.0应用程序,该应用程序从C++应用程序引用类型库。这用于一些安全的COM互操作,我最初曾问过here。

在我的开发机器上,安装了第二个应用程序,因此我可以毫无问题地进行编译。如果我尝试在我们的自动生成服务器或任何安装了Visual Studio但没有第二个程序的计算机上进行编译,则会收到以下错误,并且编译失败:

Google文字:

找不到类型或 namespace 名称(您是否缺少using指令或程序集引用?)

无法获取类型库“guid ....” 1.0版的文件路径。图书馆未注册。 (来自HRESULT的异常:0x8002801D(TYPE_E_LIBNOTapped))

找不到引用的组件“SecurityAgentLib”

图片的可读性:

除了安装用于注册实现这些类型的实际dll的应用程序外,我不确定如何解决此问题,但是我不想在构建服务器上执行此操作。使用这些类型的代码包装在一个不会实例化的类中,除非运行先决条件检查以确认该应用程序已实际安装,所以不会出现运行时错误。实际上,我可以在没有安装第二个应用程序的机器上很好地运行我的应用程序-我只是不能在那里编译它。

在Visual Studio中,引用指向解决方案目录中包含的.tlb文件,因此存在tlb文件本身。

我无法想象它应该以这种方式工作,我已经四处搜寻,但显然我没有在寻找正确的术语。

编辑:
我认为至少运行tlbimp.exe会生成一个dll,但类型库应足以进行编译。还有一个引用损坏的问题。我正在阅读本文Troubleshooting Broken References,它说,如果引用的是未安装的COM组件,则比安装该组件更正了该错误,这是正确的。

在构建服务器上安装它确实不是一种选择。如果路径断开,则打开Visual Studio并重新添加引用也不起作用。

我能够使用tlbimp创建一个dll,并使用visual studio添加对该dll的引用。这让我可以进行编译,但是在无人看管的构建服务器中如何工作?

编辑
好吧,我提出了两个可行的解决方案,因为我的要求都是无人值守

  • 运行tlbimp从类型库创建dll。我从项目中删除了对tlb的引用,并添加了对dll本身的引用。将源代码复制到新计算机时,它可以毫无问题地进行编译。

  • 在这种情况下,理想情况下,我们将在构建服务器上从SVN checkout ,并从第二个项目复制最新的DLL,然后编译该项目。
  • 我还删除了tlb,并在Visual Studio中添加了dll,并对.csproj文件进行了比较。我没有看到仅对dll而不是tlb进行引用的任何弊端,但是如果需要,构建服务器可以直接对该文件进行修改以删除tlb部分,并在第二个构建之后添加对dll的引用产品。
  • 最佳答案

    这有两个可行的选择。

  • 运行tlbimp从类型库创建dll。我从项目中删除了对tlb的引用,并添加了对dll本身的引用。将源代码复制到新计算机时,它可以毫无问题地进行编译。

  • 在这种情况下,理想情况下,我们将从构建服务器上的SVN checkout ,并从第二个项目中复制最新的DLL,然后编译该项目。
  • 我还删除了tlb并添加了dll,并对.csproj文件进行了比较。我看不到仅引用dll而不是tlb的任何缺点,但是构建服务器可以直接对此文件进行修改以删除tlb
  • https://stackoverflow.com/questions/8517254/

    相关文章:

    ios - Amazon IOS SDK : compiler warnings - ARC iss

    c++ - C++/LabVIEW互操作: error extracting data from L

    android - Android Intent使用情况(Call_action和new_task_

    flash - Flash编译器不允许覆盖

    c++ - `invalid initialization of non-const referen

    .net - 错误: “Expression must have class type” C++/C

    java - 保存一个整数onClick,以便以后可以在android应用中调用它

    java - 即使定义了类和参数,Java也找不到符号错误?

    C++ - 清理后 Unresolved external symbol 错误

    android - Dalvik格式失败,在ServerAssistant上出现错误1