我有:


主程序类-使用库A
库A-具有部分类,这些类混合了库B中的方法
库B-混合方法和接口


因此,在库B中,当我包含实现INode的部分Node类(在库B中定义)时,突然在我的主类中使用库A中的Node时出错。该错误告诉我在主类中我必须有一个使用对库B的声明。

有任何想法吗?

编辑-除代码外

    // *** PROGRAM ***
    class Program
    {
        static void Main(string[] args)
        {
            var context = new Model1Container();
            Node myNode;  // ** WITHOUT A using for Library B I have an error here ***
         }
     }


// ** LIBRARY A
namespace TopologyDAL
{
    public partial class Node
    {
        // Auto generated from EF
    }

    public partial class Node : INode<int>   // to add extension methods from Library B
    {
        public int Key
    }
}

// ** LIBRARY B
namespace ToplogyLibrary
{
    public static class NodeExtns
    {
        public static void FromNodeMixin<T>(this INode<T> node) {
           // XXXX
        }
    }
    public interface INode<T>
    {
        // Properties
        T Key { get; }

        // Methods
    }


}

编辑2-要澄清是参考还是使用错误:

因此,针对“ Node myNode;”出现的错误行是:


  错误1的类型
  在以下位置定义了“ Topology.INode`1”
  未引用的程序集。
  您必须添加对程序集的引用
  '拓扑,版本= 1.0.0.0,
  文化=中立,
  PublicKeyToken = null”。 U:\我的
  Dropbox \ source \ TopologyLibrary \ TopologyDAL_ConsoleTest \ Program.cs 11 13拓扑DAL_ConsoleTest


当我让VS为我修复它时,它将添加Library2作为参考。客户端代码之前或之后都没有“使用”。因此,问题是参考未使用问题。

编辑3-不是专门针对这个问题,但是,我现在注意到在程序项目中,除非我对库B有using语句,否则看不到mixin方法(来自库B)?我可能会为此创建一个单独的问题。

最佳答案

我对发生的事情的理解是,您只能从Main程序引用库A,并且编译器会告诉您添加对库B的引用,因为库B公开了某些库A公开的类型。

要解决此问题,请在主程序项目中添加对库B的引用。

这是小图。如果库A公开了库B中定义的类型,则Main也必须引用库B。以下情况将不起作用:

_____________             _____________               _____________
| Main       |references  | Library A  |references    | Library B  |
|           -|------------|->         -|--------------|->          |
|            |            | public     |              | SomeType   |
|            |            |  SomeType  |              |            |
|            |            |            |              |            |
-------------             -------------               -------------


仅当通过库A访问库B中定义的类型时,这才是问题。这将在以下情况之一中:


编辑库A(Node)中定义的类型派生自库B(INode<int>)中的类型。
库A中定义的方法使用库B中的类型作为返回类型或自变量。
库A中定义的类型将库B中的类型公开为属性或公共字段。


您将需要从Assembly1添加对Assembly3的引用才能进行编译。

_____________             _____________               _____________
| Main       |references  | Library A  |references    | Library B  |
|           -|------------|->         -|--------------|->          |
|            |            | public     |              | SomeType   |
|            |references  |  SomeType  |              |            |
|           -|------------|------------|--------------|->          |
|            |            |            |              |            |
-------------             -------------               -------------

关于c# - 为什么我的使用库A的C#客户端需要对库B有一个using语句(A使用),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33624181/

10-11 22:26