0

我有一个C#库,它有System.Data.SQLite作为参考,以及一个使用库的可执行文件(作为第二个项目)。Visual Studio 2010中的引用转发(从库到可执行文件)

在图书馆里,我有它引用System.Data.SQLite类(特别是SQLiteDataReader类)功能:

public static IEnumerable<T> SQLiteFetch<T>(Func<SQLiteDataReader, T> formator, string connectionString, string query) 

库编译正确,但不调用该函数的可执行文件。

这出现在构建错误,说我“必须添加一个引用程序集'System.Data.SQLite'”。我知道这是由于IEnumerable,但为什么不是通过我的库转发的引用?我真的必须在我的可执行文件中添加对System.Data.SQLite的引用吗?

回答

1

是的,你必须添加一个对你的可执行文件的引用,因为当你创建你的formator时,.NET期望它的类型为Func<SQLiteDataReader, T>。由于你的可执行文件没有对System.Data.SQLite的引用,它不知道如何处理你的格式。即使您通过null作为格式符,情况也是如此。

2

程序集只知道它的直接引用(比如你的库),并且不递归加载其引用的引用,所以你将不得不添加引用到你的可执行文件。

你的库可以包含一个从SQLiteDataReader继承的包装类来解决这个问题,但我没有看到这样做的其他优点,除非你真的不希望可执行文件具有额外的引用。

+1

我会给+1,因为你是对的,但是包装第三方库有很多好处。如果你正在提供一个应用程序使用的库(尤其是面向外部的),那么你不希望用户关心库的实现细节。在这种情况下,最好将引用的库抽象出来并通过包装器控制对系统的访问。我同意,这并不总是必要的,但是当你想要这样做时,有确定的时间。 – 2012-04-24 21:57:00

相关问题