2

2つのプロジェクトがあります。どちらも WPF アプリケーションです。 アプリケーションエラー

アプリケーション 1 : 外部ハードウェアとの相互通信のみを提供します。そのために、Application ルート クラスにはいくつかのパブリック共有クラスがあります。

Public Shared Log As New clsLog
Public Shared NavigationObjectContainer As New Dictionary(Of String, Object)

2 番目のプロジェクトは主にGUIであり、Application ルート クラスでいくつかのパブリック共有クラスも使用します。

Public Shared Nav As New clsNavigationHelper

これで、2 番目のプロジェクト (GUI) がプロジェクト 1 (ハードウェア) への参照を取得し、次のエラーが表示されます。

Der Typeninitialisierer für "TB_HyperTerminal.Application" hat eine Ausnahme verursacht. これはドイツ語ですが、クラス 1 (ハードウェア) の Application オブジェクトがすべての共有クラス (clsLog や NavigationObjectContainer など) を見つけることができないことを意味します。

内部例外

{"Das Objekt des Typs "FSCANT3.Application" kann nicht in Typ "TB_HyperTerminal.Application" umgewandelt werden."}

私の質問は、これを解決して、各プロジェクトの正しいアセンブリと正しいApplicationオブジェクトを取得する方法です。

理由を検索すると、プロジェクト 2 (ハードウェア) のクラスの名前を TBHApplication に変更しましたが、プロジェクト 1 は引き続きアプリケーションと呼ばれます。いいえ、キャストができない理由はわかります。 アプリケーションのキャスト

4

2 に答える 2

0

2 番目のプロジェクトの出力ディレクトリにコピーしないアプリケーション 1 の依存アセンブリはありますか?

以下のコメントで議論した後に更新してください。

あなたの問題を理解しているので、app1 が app2 のメソッドを使用できるようにしたいと考えています。これを行うには、2 つのアプリケーション間に共通のインターフェイスが必要です。たとえば、アプリ 1 が必要とし、アプリ 2 によって実装されるすべてのメソッドを定義するインターフェイスを含む 3 番目のプロジェクト (「クラス ライブラリ」タイプ) を作成します。app1 と app2 の両方が、この新しい DLL を参照します。このインターフェイスを app2 アプリケーション オブジェクトに実装すると、app1 は現在のアプリケーション オブジェクトをこのインターフェイス タイプにキャストし、メソッドを呼び出すことができます。ただし、app1がスタンドアロンモードでどのように機能するかを理解しているかどうかはわかりません(これは必要ですか?そうでない場合は、app1もクラスライブラリにするべきではありませんか?)。

この通信にアプリケーション クラスを使用するのは少し特殊であることに注意してください。通常の方法は、IoC コンテナーを使用するか、単に app2 がインターフェイスの実装を設定できる app1 のプロパティを使用することです。

于 2012-09-20T12:15:05.307 に答える
0
Dim AppInfo As Global.Microsoft.VisualBasic.ApplicationServices.AssemblyInfo = GetApplicationInfo()


    Private Function GetApplicationInfo() As Global.Microsoft.VisualBasic.ApplicationServices.AssemblyInfo
        Dim ret As Global.Microsoft.VisualBasic.ApplicationServices.AssemblyInfo = Nothing
        Try
            Dim asm As System.Reflection.Assembly = System.Reflection.Assembly.GetEntryAssembly
            ret = New Global.Microsoft.VisualBasic.ApplicationServices.AssemblyInfo(Global.System.Reflection.Assembly.GetExecutingAssembly())
        Catch ex As Exception
        End Try
        Return ret
    End Function


 Private Function GetApplication() As Global.System.Windows.Application
        Dim ret As Global.System.Windows.Application = Nothing
        Try
            ret = CType(Global.System.Windows.Application.Current, Global.System.Windows.Application)
        Catch ex As Exception
        End Try
        Return ret
    End Function
于 2012-09-20T15:11:06.373 に答える