使用本地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,相反,它引用了一个"运行时可调用包装器"(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引用。