使用本地dll生成应用程序,而不使用全局程序集缓存

本文关键字:全局 程序集缓存 dll 应用程序 | 更新日期: 2023-09-27 18:28:32

我用Oracle查询构建了一个小型控制台应用程序,因此添加了对Oracle.DataAccess的引用。当我发布并在其他计算机上安装我的应用程序时,我运行了一个未处理的异常,并显示一条消息,抱怨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是否具有Publish Status=Include(Auto)。

然而,这是行不通的。在另一台机器上,只有在Oracle.DataAccess.dll安装在c:'oracle中的某个位置时,该应用程序才能工作。

我的问题是:如何将(此)dll包含到项目中,使其不必安装在计算机上或位于c:''oracle中?

或者:关于GAC,我需要了解什么才能以这种方式修复它?

使用本地dll生成应用程序,而不使用全局程序集缓存

在我的公司,我们这样做的方式——可能不是对每个人都最有效的方式——是单独安装第三方软件。您的应用程序实际上并没有直接引用第三方DLL,相反,它引用了一个"运行时可调用包装器"(RCW),当您在项目中添加引用的第三方DLL时,该包装器会自动生成;因此,您的应用程序正在GAC或您的输出目录中查找,例如"Interop.Oracle.DataAccess.DLL",然后,"Interop.Oracle.DDataAccess.DLL"在"C:''Oracle"中查找第三方"Oracle.DataAccess.DLL"。

我们单独安装第三方软件的原因是,我们可以独立于自己的自定义软件进行管理。查看它就像安装windows功能一样,以便为您的自定义应用程序提供一些可用的内容。

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

诚然,此解决方案更适用于公司中部署到由IT成员团队控制的多个桌面上的应用程序。听起来您的情况范围要小得多,所以您当然可以将Oracle组件与应用程序一起安装,而不是单独安装。不过,总体想法保持不变:它们仍然应该部署到它们的"自然"位置(c:''Oracle),然后由输出目录中的RCW引用。