构建一个无需访问引用dll的Visual Studio项目

我有一个项目,它有一组二进制依赖项(我没有源代码的程序集dll)。 在运行时,这些依赖项需要预先安装在机器上,并且在编译时它们在源代码树中是必需的,例如在lib文件夹中。 由于我还为此程序提供了源代码,因此我希望为其启用简单的下载和构建体验。 不幸的是,我不能重新分配dll,这使事情变得复杂,因为VS不会在不访问引用的dll的情况下链接项目。

无论如何,在没有真正参考的dll的情况下,能够建立并链接这个项目吗?

也许这是一种方法来告诉VS链接到一个自动生成的dll的存根,以便它可以重建没有原始? 也许有第三方工具可以做到这一点? 这方面的任何线索或最佳实践?

我意识到这个人必须能够访问dll来运行代码,所以他可以将它们添加到构建过程中是有道理的,但我只是想要拯救他们收集所有dll并将它们放入lib文件夹手动。


也许其中一个想法可以帮助你解决这个问题:

  • 从第三方dll中的所有类派生接口。 将这些接口放入一个自己的项目中(相同的解决方案),并添加对该接口组件的引用。 还要将一个EventHandler添加到AppDomain.AssemblyResolve并尝试在运行时查找并加载程序集。 (积分去NG)
  • 根据dll的大小以及公共部分的变化频率,这可能会产生真正的痛苦。
  • 提供一个readme.txt,您可以在其中解释如何获取所需的程序集以及用户应该将它们放置到项目路径的哪个位置。 通常情况下VS很聪明,可以在你将程序​​集放到正确的位置后删除感叹号,项目引用它的位置(也许你必须在解决方案资源管理器中按下刷新)(信贷转到Paul)
  • 不要忘记将readme.txt添加到解决方案中方法是右键单击解决方案并选择“添加 - >现有项目”。 在这种情况下,它将在Visual Studio Solution Explorer中得到一个非常显眼的地方,用户可以通过双击来阅读它。
  • 在您的解决方案中创建另一个项目,可以自动下载所需的所有dll并将它们放到正确的位置。 也许它应该事先检查这些所需的文件是否已经存在,然后才开始下载。 设置您的原始项目的项目依赖项,以便它依赖于此项目。 所以它会始终在你原来的之前建造。 然后在原始项目的预生成事件中启动此下载帮助器工具,并且不要忘记以int值退出程序。 0意味着成功,任何其他错误,所以Visual Studio也知道你的工具是否成功,并在挂上缺少的dll之前停止编译过程。
  • 也许自动下载文件几乎是不可能的,因为您需要登录到网页或使用某些工具无法自动执行的cookie,flash,captcha等。

  • 对上面所有的好建议,都表示同意。 话虽如此,也许有一个有效的情况下,通常不需要外部DLL? 所以这就是你所做的。 你包装并隔离它们。 (它的抽象层次比创建接口更高,因此更容易维护)。

    在Visual Studio中,如果您不重新编译引用外部DLL的特定VS项目,那么您可以在不使用这些DLL的情况下编译VS解决方案项目的其余部分。 因此,如果以某种方式将外部DLL与自己的DLL一起包装,然后将这些包装仅作为二进制分发,那么共享源代码的人将不需要外部DLL来编译主要解决方案。

    注意事项 :1.额外的工作将封装代码分离成独立的项目。 2.其他VS项目必须添加对您的包装DLL的引用,作为“文件系统”对“LIB”文件夹的引用,而不是“项目引用”。 3. VS解决方案配置必须禁用包装DLL的编译。 如果需要,应该添加一个新配置以明确重新编译它们。 4.每个Wrapper DLL的VS Project定义都应该包含一个构建后事件,以将它们复制到预期的“LIB”文件夹位置。 5.在运行时,外部DLL必须存在于应用程序的bin目录或机器的GAC中,否则将被明确加载。 注意:如果它们丢失,只有当它们在运行时实际调用时,它们的缺失才会导致运行时错误。 即如果代码在一般情况下没有发生,则不需要拥有它们。 6.在运行时,您可以捕获加载外部DLL的错误,并向用户显示一条错误消息,说“为了使用此功能,请安装以下产品:xyz”。 这比显示“AssemblyLoadException ...请使用FusionLogViewer ...等更好”。7.在应用程序启动时,您可以测试和检测缺少的DLL,然后禁用依赖于它们的特定函数。

    例如:根据这种模式,我可以有一个与Microsoft CRM和SAP集成的应用程序,但只适用于特定功能,即导入/导出。
    在设计时,如果开发人员从不想改变包装器,他们将能够在没有这些外部DLL的情况下重新编译。 在运行时,如果用户从不调用这个函数,应用程序将永远不会调用这个包装器,因此不需要外部DLL。


    那么保存它们收集所有程序集并将它们放在lib文件夹中的痛苦吧。 然后将它们与源代码一起提交到存储库中。 这样,从存储库中检出代码的人也将获得编译该项目所需的所有内容。

    链接地址: http://www.djcxy.com/p/45205.html

    上一篇: Build a Visual Studio Project without access to referenced dlls

    下一篇: Unable to capture standard output of process using Boost.Process