0

我在 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 的异常:无法从程序集“父级,版本=1.0.0.0,文化=中性,PublicKeyToken=null”加载类型“Child.some.class”。

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

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

4

3 回答 3

2

通常,您希望颠倒您的层次结构:您的 .exe 项目应该取决于您的附属程序集项目(您称之为“子”)。然后,要使用附属程序集中的类型,您需要将 .exe 项目中的引用添加到程序集项目中。通过在 VS 的解决方案资源管理器中右键单击 .exe 项目来执行此操作,然后执行 Add Reference ... 单击 Projects 选项卡并选择程序集项目。

编辑:如果您想为整个项目设置一个“框架”(通过定义接口或基类),那么我将从一个单一的核心程序集中开始;将这些定义放在 MyProject.Core.dll 之类的文件中。然后,您的“实施”项目/程序集将引用您的 MyProject.Core 项目。综上所述,您可能正在寻找诸如 IOC / DI 框架之类的东西。参见NinjectStructureMapCastle Windsor等。

于 2010-03-29T21:12:04.533 回答
0

你想避免循环依赖。

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

于 2010-03-29T21:24:08.203 回答
0

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

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

这似乎有点做作,但至少它有效。

于 2010-03-31T02:02:59.257 回答