用本地dll构建app而不使用全局程序集缓存

时间:2014-10-31 13:24:05

标签: c# visual-studio-2010 dll

我使用Oracle查询构建了一个小型控制台应用程序,因此我添加了对Oracle.DataAccess的引用。当我发布并安装我的app其他计算机时,我遇到了一个未处理的异常,并发出一条消息,抱怨Oracle.DataAccess不在GAC全局程序集缓存中。不知道如何修复GAC,甚至不知道究竟是什么,我尝试将Oracle dll添加到我的应用程序中。所以我在我的项目中创建了一个名为dll的目录来存储该DLL。我删除了对Oracle.DataAccess的引用,并添加了对本地dll/Oracle.DataAccess.dll的引用。

运行发布后,dll确实被复制了。

我确保调整项目Properties,标签Publish,按钮Application Files中的设置:删除Oracle.DataAccess.dl l的旧条目并检查dll/Oracle.DataAccess.dll发布状态=包含(自动)。

然而,这不起作用。在另一台计算机上,仅当Oracle.DataAccess.dll中安装了c:\oracle时,该应用才有效。

我的问题是:如何在项目中包含一个(this)dll,以便它不必安装在机器上或位于c:\ oracle中?

或者:我需要了解GAC以哪种方式修复它?

1 个答案:

答案 0 :(得分:0)

我们在公司工作的方式 - 可能不是最适合每个人的方式 - 是单独安装第三方软件。您的应用程序实际上并不直接引用第三方DLL,而是引用了一个"运行时可调用的包装器" (RCW)在您为项目添加引用的第三方DLL时自动生成;因此,您的应用程序正在寻找,例如," Interop.Oracle.DataAccess.DLL"无论是在GAC中还是在输出目录中,然后依次是" Interop.Oracle.DataAccess.DLL"正在寻找第三方" Oracle.DataAccess.DLL"在" C:\ Oracle"。

我们单独安装第三方软件的原因是我们可以独立于自己的自定义软件进行管理。将其视为安装Windows功能,以便为自定义应用程序提供可用的内容。

因此,要将此应用于您的情况,您可能希望通过桌面或网络管理员推出的MSI安装Oracle数据访问(不确定哪个标题适合,但它是该人负责部署第三方软件和Windows更新)。然后,您的应用程序将单独安装,包括您的应用程序目录中的RCW dll(忘记GAC),它应该可以正常工作。

当然,此解决方案可以更好地将公司中部署的应用程序更好地应用于由IT成员团队控制的多个桌面。听起来您的情况范围要小得多,因此您可以将Oracle组件与应用程序一起安装,而不是单独安装。但总体思路仍然是相同的:它们仍然应该被部署到他们的自然"放置(c:\ Oracle),然后由输出目录中的RCW引用。