2016-05-05 1 views
0

クラスは参照されていないアセンブリを継承できますか?それとも自立させることができますか?クラスは自立できますか?

私は動的に参照されていないDLLをロードし、自分自身にそれを設定できるようにしたいのですが - のようなもの:

Public Class MyProject.SomeClassWrapper 
    Inherits System.Windows.Forms.AxHost 

    Public Sub New() 
     Dim dynamicallyLoadedAssembly As System.Reflection.Assembly = System.Reflection.Assembly.LoadFile("C:\Temp\SomeLibrary.dll") 
     Me = dynamicallyLoadedAssembly.CreateInstance("SomeLibrary.SomeClass") '<----- Doesn't work, but is there a way to do this?    
    End Sub 
End Class 

それとも、動的にクラスをロードし、それを継承?

'This class has the some of the properties/methods/etc as the library being imported 
Public Class MyProject.SomeClassWrapper 
    Inherits System.Windows.Forms.AxHost 

    Public Sub New(clsid As String) 
     MyBase.New(clsid) 
    End Sub 

    Public Sub SomeSubroutineHere() 
     'Do something 
    End Sub 
End Class 

'This class needs to inherit from a dynamically loaded assembly via reflection 
Public Class MyClass 
    Inherits MyProject.SomeClassWrapper 

    Public Sub New() 

     Dim dynamicallyLoadedAssembly As System.Reflection.Assembly = System.Reflection.Assembly.LoadFile("C:\Temp\SomeLibrary.dll") 
     Dim newInstance = dynamicallyLoadedAssembly.CreateInstance("SomeLibrary.SomeClass") 
     Dim strCLSID as String = "Where can i get the CLSID from here?" 

     MyBase = newInstance '<<< I want to set "MyBase" to the new instance so that when MyBase.New() is called, it's the full inherited library 
     MyBase.New(strCLSID) 
    End Sub 
End Class 

ありがとうございます!

+0

いいえ、あなたはこれらのことを行うことはできません。オブジェクトが作成(または作成)されると、オブジェクトはタイプまたはインスタンスを変更できません。 VBは静的型言語です。 – Enigmativity

+0

私に割り当てることはできません。まったく。あなたは本当に達成しようとしていますか?自分のライブラリを動的に読み込んでいるのですか?ライブラリは何を行い、なぜそれを動的にロードする必要がありますか? –

答えて

1

いいえ、これらのことはできません。オブジェクトが作成(または作成)されると、オブジェクトはタイプまたはインスタンスを変更できません。 VBは静的型言語です。

しかし、デコレータパターンを使用して閉じることができます。

はこれを試してみてください:

Public Interface IDecorator 
    Sub DoSomething() 
End Interface 

Public Class MyDecoratorClass 
    Implements IDecorator 

    Private _inner As IDecorator 

    Public Sub New() 
     Dim dynamicallyLoadedAssembly = System.Reflection.Assembly.LoadFile("C:\Temp\SomeLibrary.dll") 
     Dim newInstance = dynamicallyLoadedAssembly.CreateInstance("SomeLibrary.SomeClass") 
     _inner = CType(newInstance, IDecorator) ' `newInstance` must implement `IDecorator` 
    End Sub 

    Public Sub DoSomething() Implements IDecorator.DoSomething 
     _inner.DoSomething() 
    End Sub 
End Class 

あなたはMyDecoratorClassIDecoratorメソッドを呼び出したときに今、実際の呼び出しは、動的にロードされたインスタンスを介して送信されます。

+0

ありがとうございます - 私はそれを動作させることができるかどうかを見るために、今日これを実験します。 1つの質問 - あなたは "VBは静的型言語です"と言っています。あなたは.NETを意味しましたか、それともC#を使って実行できることを意味していますか? – Losbear

+0

@Losbear - 質問はVBについてだったので、私はC#には及ばなかったが、それは同じである。しかし、.NET言語には多くのものがあり、動的であり、あなたが何をしているのかがわかるので、一般的に.NETといっても意味がありません。 – Enigmativity

関連する問題