代码之家  ›  专栏  ›  技术社区  ›  user304582

Visual Studio 2008可执行文件和程序集的项目组织

  •  0
  • user304582  · 技术社区  · 15 年前

    我在visual studio 2008中设置以下内容时遇到问题:包含entrypoint main()方法类并声明接口的父项目,以及包含实现父项目中声明的接口的类的子项目。

    我已指定父级的输出类型是控制台应用程序,子级的输出类型是类库。在child中,我添加了对父项目的引用,并指定该子项目依赖于父项目,并且生成顺序应该是父项目,然后是子项目。

    构建成功了,据我所知,正确的东西出现在child/bin/debug目录中:parent.exe和child.dll。

    但是,如果我运行parent.exe,那么在它应该从child.dll加载类时,它将失败,并显示错误消息:

    执行操作System.TypeloadException时发生异常:无法从程序集“Parent,version=1.0.0.0,Culture=Neutral,PublicKeyToken=null”加载类型“Child.Some.Class”。

    我想我对如何让父母和孩子的项目一起玩感到困惑。我计划有更多的子项目使用在父项目中设置的相同框架,因此我不想将entrypoint类向下移动到子项目中。如果我试图指定子项目也是控制台应用程序,则生成过程将失败,因为子项目中没有main()entrypoint类(即使父项目作为引用包含在内)。

    欢迎任何帮助!谢谢,马丁

    3 回复  |  直到 13 年前
        1
  •  0
  •   Jason Williams    15 年前

    您希望避免循环依赖关系。

    如果希望将接口和实现分离,请在“子”程序集(类库)使用的第三个程序集中(类库)定义接口,然后从应用程序中同时使用接口和实现。

        2
  •  2
  •   xanadont    15 年前

    一般来说,您需要颠倒层次结构:您的.exe项目应该依赖于您的附属程序集项目(您称之为“子项目”)。然后,要使用附属程序集中的类型,需要将.exe项目中的引用添加到程序集项目中。右键单击VS解决方案资源管理器中的.exe项目,然后添加引用…单击“项目”选项卡并选择程序集项目。

    编辑: 如果要为整个项目设置“框架”(通过定义 interfaces 或者基类),然后在一个单独的核心程序集中开始;将这些定义放在myproject.core.dll之类的文件中。然后,“实现”项目/程序集将引用myproject.core项目。尽管如此,您可能会寻找类似ioc/di框架的东西。见 Ninject , StructureMap , Castle Windsor 等。

        3
  •  0
  •   Oleks    13 年前

    所以在回答自己问题的优良传统中,我这样做是为了 GetType() 成功,我必须指定正确的程序集。每个项目都编译成自己的程序集( Application.exe , Interface.dll Implementation.dll )所以为了在 Application Main() 同学们,我要打电话给:

    Type actionType = Type.GetType("ImplementationClass", "Implementation", true);
    

    这看起来有点无礼,但至少管用。