我正在尝试为.NET 2.0应用程序添加SQL2008支持。但是,我的独特构想是一些用户仍然会使用SQL2005,我不想要求他们安装SQL2008客户端组件。
SQL2008所需的实际DLL集与SQL2005不同。代码可以保持不变。
Botton line,我需要在VS2005中使用一种方法(或手动编辑汇编文件)来说:
如果用户具有DLL_1 v2,则DLL_2 v2和DLL_3 v2将使用它们。如果没有,请使用DLL_1 v1和DLL_2 v1。
我将研究使用反射加载DLL,听起来这几乎是我唯一的选择,除了需要SQL 2008客户端组件。
至于重新分发DLL,我确实阅读了许可证。那里有几个可疑的术语适用于我们(例如,托管软件)。此外,这是一个更复杂的问题,因为我们的客户数据非常敏感,因此他们会通过广泛的审批流程来允许安装任何内容,例如我们包含的DLL。
感谢您的帮助!
感谢您的想法!但是我们还没有完全......
不,用户不会选择要安装的数据库版本。目的是允许SQL2005和/或SQL2008,即使在同一个安装中也是如此。例如,我们有一个管理应用程序允许用户跨不同的SQL服务器管理数据库实例。
我意识到我们可以添加一个对话框来选择是否需要SQL2008支持。但是,这会进一步扩展我们的测试矩阵,这是我们试图避免的。
我相信我确实需要直接引用DLL。我在数据库方面做的不仅仅是连接和查询。
我需要的DLL是:
还有其他想法吗?
答案 0 :(得分:1)
Reflection允许您在运行时动态加载所需的DLL集。所以你可以检测出什么是可用的并然后加载它。
唯一的缺点是使用Reflection可以使您的工作更加困难和耗时。
答案 1 :(得分:0)
您可以在代码中更改表适配器的连接字符串,以便为SQL2008编写全新的dll吗?
答案 2 :(得分:0)
如果您只是在进行基本的数据访问,那么您不必担心它,本机客户端应该可以正常工作,您可以让框架为您提供支持。如果您指定SQL客户端,.Net将使用它可以获得的任何一个。你在使用SMO对象吗?在这种情况下,可能存在一些依赖性问题。
答案 3 :(得分:0)
您根本不必直接引用任何DLL。如果您使用System.Data.SqlClient连接到您的数据库,那么.Net将知道如何与它们进行通信。如果您没有使用System.Data.SqlClient与您的服务器进行通信,那么您可以切换到下一个问题,以便进行数据库通信。
这可能有点超出您想要做的范围,但是您可以创建服务层抽象,其中每个人都连接到服务层,服务层处理路由以及与数据库服务器和您的通信可以通过SOAP或.Net Remoting与服务层进行通信。我已经开始将所有应用程序切换到此方法,因为它允许我将业务逻辑和数据库抽象集中在一个受控位置,并在本地计算机上使用演示文稿。
答案 4 :(得分:0)
用户是否选择要安装的数据库版本? (我假设有某种安装过程)。您可以根据所选的数据库版本替换安装中bin文件夹中的dll文件吗?
答案 5 :(得分:0)
您可以使用服务容器并连接配置文件中的依赖项。它可能需要将依赖于任一组程序集的代码分离为单独的类和程序集。
IE中。两个类库,一个用于2005,一个用于2008,两个类都包含一组实现一组公共接口的类。然后,应用程序只需向服务容器询问实现其中一个公共接口的对象,并且应用程序配置文件将指示将使用哪个实现。
此配置当然也可以在应用程序启动时在代码中完成。
这种方法还可以让你做的不仅仅是使用一组不同的dll。如果2005年的某些事情需要以不同于2008年的方式完成,那么您可以在类库中实现这些差异,而应用程序将更加明智。