从同一解决方案中的另一个Windows窗体项目引用Windows窗体项目

时间:2010-12-08 21:38:40

标签: vb.net winforms inheritance reference

我有几个项目的解决方案,其中大部分是代码或控制库。我有一个主窗口表单应用程序,它引用并使用这些库。我想要做的是创建一个扩展主要应用程序的第二个Windows应用程序,但我希望能够将它们作为单独的exe进行部署。

当我尝试添加引用主应用程序的新应用程序的引用时;一切似乎都很好,直到我尝试运行新的应用程序我得到几个类似于下面的错误消息:

Error   1   Could not find file 'ADODB.dll' referenced by assembly 'D:\Visual Studio 2005\Projects\X\XX\bin\Debug\XXX.exe.manifest'.    <newAppName>

我尝试在错误消息中添加对所有dll的引用,当我尝试运行新应用时,它们仍会列出。我想到了一些解决方法,但它们需要用户更改以在部署时维护单独的exe。如果可能的话,我想避免这种情况。有什么想法吗?

先谢谢,杰夫

2 个答案:

答案 0 :(得分:0)

你的Windows窗体应用程序不应该是你扩展的点,exe文件应该只是一个用于启动你的进程的shell(尽可能多的)。所以这个回答并没有回答你参考exes的具体问题,因为这不是一个好的做法。

所有扩展都应该通过已知的接口或合同对您的代码或控件库进行。通常,扩展此类应用程序的过程是使用在运行时加载的备用或附加DLL。

假设您有一个名为clock的应用程序来显示时间。

您可以使用可引用的DLL“Clock.Contracts.dll”中的一组契约(或接口)构建应用程序:

public interface ITimeService
{
public string Name { get; }
public Date GetTime();
}

然后你在另一个DLL(“Clock.LocalComputer.dll”,“Clock.InternetTime.dll”

中执行此操作。
public class LocalTime : ITimeService
{
public string Name
{ get { return "Local Time"; }}
public Date GetTime()
{ return Date.Now; }
}

在UI / EXE中,您始终引用的界面不会调用实现。

如何获取实现类的实例,使用Reflection来识别DLL中的类是否实现接口,使用Activator.CreateInstance来生成类。

http://gsraj.tripod.com/dotnet/reflection.html

有一些模式,如控制反转和依赖注入,它们有助于在应用程序中以标准化方式解决这些问题。第三方图书馆如Castle Windsor,Spring可以提供帮助。谷歌搜索这些将给你一些阅读材料。

我会说完全了解这些事情可能需要一段时间。

答案 1 :(得分:0)

好的,我找到了合理的解决方法。基本上,您将所有重复使用的表单添加为现有项目,但不是单击添加,而是单击下拉箭头并选择添加为链接。

按照JTew上面的建议进行重新设计会很棒,但是这让我无需移动代码即可。

您可以找到更多信息here

感谢您花时间查看此内容,希望对更多内容有所帮助

Jeff Spo