Visual Studio 2008项目组织,用于执行和组装

时间:2010-03-29 21:07:30

标签: visual-studio console projects

我在Visual Studio 2008中设置以下内容时出现问题:包含入口点Main()方法类并声明接口的父项目,以及具有实现父项中声明的接口的类的子项目项目

我已指定Parent的Output类型是Console应用程序,Child的Output类型是Class库。在Child中我添加了对Parent的引用作为项目,并指定Child依赖于Parent,构建顺序应该是Parent,然后是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”。

我想我对如何让父母和孩子的项目一起玩感到困惑。我计划让更多的子项目使用在Parent中设置的相同框架,因此我不想将入口点类转移到Child项目中。如果我尝试指定Child项目也是Console应用程序,那么构建过程将失败,因为子项中没有Main()入口点类(即使包含Parent项目作为参考)。

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

3 个答案:

答案 0 :(得分:2)

通常,您希望反转您的层次结构:您的.exe项目应该依赖于您的附属程序集项目(您称之为“Child”)。然后,要使用附属程序集中的类型,您需要将.exe项目中的引用添加到程序集项目中。通过右键单击VS的Solution Explorer中的.exe项目,然后执行Add Reference ...单击Projects选项卡并选择组装项目来执行此操作。

编辑: 如果你想为整个项目设置一个“框架”(通过定义interfaces或基类),那么我首先要在一个核心程序集中这样做;将这些定义放在MyProject.Core.dll之类的内容中。然后,您的“实现”项目/程序集将引用您的MyProject.Core项目。尽管如此,你可能正在寻找像IOC / DI框架这样的东西。请参阅NinjectStructureMapCastle Windsor

答案 1 :(得分:0)

您希望避免循环依赖。

如果您希望保持接口和实现分离,那么在“子”程序集(类库)使用的第三个程序集(类库)中定义接口,然后使用应用程序中的接口和实现

答案 2 :(得分:0)

因此,在回答自己的问题的优良传统中,我得出结论,为了成功调用GetType(),我必须指定正确的程序集。每个项目都编译为自己的程序集(Application.exeInterface.dllImplementation.dll)。因此,为了在Application Main()类中实例化实现类,我必须调用:

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

看起来有点蠢,但至少它有效。