为什么使用库A的C#客户端需要为库B使用一个using语句(A使用)

Gre*_*reg 1 .net c# interface

我有:

  • 主程序类 - 使用库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
    }
Run Code Online (Sandbox Code Playgroud)

}

编辑2 - 澄清是引用还是使用错误:

所以针对"Node myNode"出现的错误; 线是:

错误1类型"Topology.INode"1'在未引用的程序集中定义.您必须添加对程序集"Topology,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null"的引用.U:\ My Dropbox\source\ToplogyLibrary\TopologyDAL_ConsoleTest\Program.cs 11 13 TopologyDAL_ConsoleTest

当我让VS为我修复它时,它添加了Library2作为参考.也就是说,在客户端代码之前或之后没有"使用".所以问题是参考不使用问题.

编辑3 - 不是特别关于这个问题,但我现在注意到在程序项目中,我看不到mixin方法(来自库B),除非我有一个使用语句到库B?我可能会创建一个单独的问题.

Jay*_*Jay 5

如果LibraryA公开属性,从方法返回对象,或者获取在LibraryB中定义的类型的参数,并且在其中一种类型的主程序中声明或使用变量,则需要using语句.


Igo*_*aka 5

我发生了什么事的理解是,你只能从主程序参考库和编译器会告诉你添加参考图书馆B,因为某些类型的图书馆,曝露出在图书馆B.定义

要解决此问题,请将库B的引用添加到主程序项目中.

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

_____________             _____________               _____________
| Main       |references  | Library A  |references    | Library B  |
|           -|------------|->         -|--------------|->          |
|            |            | public     |              | SomeType   |
|            |            |  SomeType  |              |            |
|            |            |            |              |            |
-------------             -------------               -------------
Run Code Online (Sandbox Code Playgroud)

当库B中定义的类型可通过库A访问时,这只是一个问题.这将是以下情况之一:

  • 在库A(Node)中定义的EDITED类型源自库B(INode<int>)中的类型.
  • 库A中定义的方法使用库B中的类型作为返回类型或参数.
  • 库A中定义的类型将库B中的类型公开为属性或公共字段.

您需要从Assembly1添加对Assembly3的引用以使其编译.

_____________             _____________               _____________
| Main       |references  | Library A  |references    | Library B  |
|           -|------------|->         -|--------------|->          |
|            |            | public     |              | SomeType   |
|            |references  |  SomeType  |              |            |
|           -|------------|------------|--------------|->          |
|            |            |            |              |            |
-------------             -------------               -------------
Run Code Online (Sandbox Code Playgroud)