如何在多个项目,单一解决方案环境(VS2012)中调用表单?

时间:2015-05-06 16:50:46

标签: .net vb.net winforms

这与此帖子Combining two projects and get a single .sln file部分相关。

在这些项目上调用表单的正确语法是什么。例如,如果Solution1包含Project1和Project2,则...和... Project1具有Form1.vb& Project2有Form1.vb。那么在Project1中从Form1.vb调用Project2中的Form1.vb的语法是什么(假设有一个按钮可以单击并在点击事件上打开一个表单)。

但是,我已添加了Project1& amp; Project2到Solution1,并添加了对My Project.Resources.Designer.vb.dll的引用。

但是当我尝试从Project1调用Project2中的Form1.vb时,出现语法错误 - 未定义Project2.Form1。

有人能指出我正确的方向吗?

非常感谢任何帮助。提前致谢。


Project1是粗体,因此是启动项目。

enter image description here



项目1的公共类Form1: -

enter image description here



项目2的公共类Form1: -

enter image description here



错误讯息: -

enter image description here



没有选择"导入命名空间": -

enter image description here



这就是Project1的形式: -

enter image description here



我的参考经理=>解决方案选项为空

enter image description here



假设我想在Solution =>中浏览参考文件上面的项目选项,我应该选择哪种文件类型?
一个。 Visual Basic项目文件
b。用户文件
c。 VSPSCC文件

enter image description here



如何从Project1(启动项目)调用Form1(在olAddIn_With_Form1中)?

回答:
通过Reference Manager窗口添加.dll然后浏览到... \ bin \ Debug \ olAddIn_With_Form1.dll

Dim myolAddIn_With_Form1Form1作为新的olAddIn_With_Form1.Form1 myolAddIn_With_Form1Form1.ShowDialog()

enter image description here



对于踢,我尝试通过"添加链接"添加整个项目。方法,我收到此错误消息

enter image description here

5 个答案:

答案 0 :(得分:3)

所以,回答一些截图:

首先创建两个项目。作为启动项目的项目(在您的示例中,在我的示例中,将是Project1)需要了解其他解决方案。为此,我们需要添加对项目的引用,右键单击Project1并单击“添加引用...”

add reference to startup project

然后,使用侧栏中的解决方案选项,单击Project2上的复选框

select second project

然后,您可以使用Project2.Form1标识符在代码中添加项目,因此

Public Class Form1

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim frmOtherProject As New Project2.Form1
        frmOtherProject.Show()
    End Sub
End Class

或者,如果第二个项目中的表单没有偏向名称(form1当前存在2次,所以我们将其重命名为form2),您可以导入第二个项目并直接使用它的类

Imports Project2

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim frmOtherProject As New Form2
        frmOtherProject.Show()
    End Sub
End Class

我使用Visual Studio 2012作为基础,但原则应该相同;)

<强> ADDITION

我可能会指出,这不是您引用项目的典型风格,大多数情况下您会按照关注程度将您的应用程序分开,例如添加:

  • 实体层,包含您的模型,并由所有其他层(解决方案)引用
  • 可以加载/保存模型并为其提供服务的数据层,这由“业务逻辑层”引用并引用实体层本身
  • 一个业务逻辑层,引用数据层和实体层,并在表示层内引用,它不知道您正在使用哪个数据库,它只是作为表示层之间的中介(这是用户看到的内容)和数据层,并且只处理实体层中定义的实体
  • 最后,表示层引用了实体层和业务逻辑层,它不需要知道哪个数据库正在为数据提供服务,而只是以有用的方式向用户提供数据< / LI>

当然,有很多方法可以将您的应用程序安排在一个有意义的结构中,但我发现这个方法是一个很好的例子,说明如何以有意义的方式构建应用程序

<强>更新

作为更新,如果您编写代码以便可以重复使用,那么让您的解决方案共享代码不应该这么难。通过在可以通过两种解决方案共享的类库中共享逻辑和更难的代码,您只需要重写表示层(如何显示数据)。您可以针对您想要使用的环境更具体地进行此操作。

最后,您的Outlook Addin解决方案和您的Windows窗体项目可以共享请求资源的代码,或加载数据,或进行一些其他复杂的计算,而您必须“重现”的唯一代码就是您如何在屏幕上显示它。因此,根据环境,您可以以更好的方式呈现数据,特定于该环境,但共享您在两个(或更多)环境中使用的逻辑和模型。

这样,您的开发时间减少了,并且您的代码变得不那么容易出错,因为您没有多次使用相同的代码,例如,请参阅以下屏幕截图:

enter image description here

如您所见,有一个共享库,由outlook addin和windows表单应用程序引用。 Forms应用程序和outlook应用程序都不知道彼此,它们也不应该,因为它们基本上与另一个没有任何关系。

所以,虽然我的最新更新没有回答你的问题,但我仍然认为这是安排你的代码的更好方法。如果您以后想要重新使用您创建的代码的网站,您只需要创建一个额外的表示层,并再次重用SharedLibrary中的代码。

答案 1 :(得分:0)

我有一个包含C#项目和VB.Net项目的解决方案。

当我在我的VB.Net项目中右键单击My Project时,我获得了一个打开的上下文菜单

enter image description here

当我点击打开时,我会看到以下屏幕

enter image description here

我点击添加按钮并进入此屏幕

enter image description here

这里列出的项目是我可以添加的C#项目,在我的VB.Net项目中,我可以调用该项目中的任何公共类。

答案 2 :(得分:0)

  1. Solution Explorer&gt;项目&gt;右键单击&gt;添加&gt;现有项目
  2. 浏览&amp;选择文件
  3. - 这是诀窍 - 点击“添加”旁边的箭头,然后选择“添加为链接”
  4. 这允许多个项目共享代码文件,而不需要共享的dll,引用或任何东西。每个应用程序都可以作为独立的EXE保留。

答案 3 :(得分:0)

如何在没有参考的情况下完成此任务:

由于我也遇到了这个问题,因此我想添加另一种方法。唯一的区别是我无法添加对第二个项目的引用,因为它已经具有现有的引用。尝试这样做将导致以下错误:

无法添加对“ XXXX”的引用。将此项目添加为 引用将导致循环依赖。

所以这是一个可行的方法(对我来说):

在我的通话课上:

'Path of the .exe which contains the form that should be opened
Dim allAssemblies As System.Reflection.Assembly = System.Reflection.Assembly.LoadFile(Application.ExecutablePath)

'loads content of the assembly file
Dim runTimeTypes As Type() = allAssemblies.GetTypes

'iterate the content
For Each runTimeType As Type In runTimeTypes

	'if matching record is found
	If runTimeType.Name = "F_myForm" Then

		'open it with the desired parameters; of course a matching constructor has to exist in "F_myForm"
		Dim parameters As Object() = {"x", "y", "z"}

		Dim form As Form = CType(Activator.CreateInstance(runTimeType, parameters), Form)

		form.Show()

	End If

Next

答案 4 :(得分:0)

我试试这个,它对我有用。

  1. 在解决方案中,右键单击要在其中显示表单的项目。
  2. 添加引用。
  3. 点击项目。
  4. 选择您的项目复选框为 true,然后单击确定。

如果错误显示(“无法添加对项目的引用...”)。 然后返回您的项目引用并删除该引用并再次重复上述步骤