用語を知っているように、「制御の反転」または「IoC」を探しています。
Nico's answer のように、依存性注入やコールバック (デリゲートなど)など、これを実装する方法は複数あります。Service Locator (多くの人はこれを「アンチパターン」と見なしていますが) と Factory もあります。
個人的には、依存性注入アプローチを好みます。
基本的に、DLL (別名「クラス ライブラリ」) は関数を実行できるオブジェクトを必要としますが、実際のロジックを実装するには他の誰か (呼び出し元) が必要です。
したがって、必要なオブジェクトの種類を定義するインターフェイスを DLL に作成するだけです。
Namespace DLL
Public Interface IDataRetriever
Public Function GetData() As Object
End Interface
End Namespace
次に、DLL を参照する MainForm プロジェクトで、このインターフェイスを実装するクラスを作成します。
Public Class DataRetriever
Implements DLL.IDataRetriever
Public Function GetData() As Object Implements DLL.IDataRetriever.GetData
//...
Return New Object()
End Function
End Class
(既に存在するクラスや MainForm 自体を含め、任意のクラスがインターフェイスを実装できることに注意してください。インターフェイスのためだけに新しいクラスを作成する必要はありませんが、関心の分離に従っていることを確認してください。)
これで、DLL を呼び出すときに DataRetriever を渡すことができ、DLL は何を処理しているかを認識します。
Namespace DLL
Public Class Utility
Public Shared Function DLLFunction( retriever as IDataRetriever )
retriever.GetData()
End Function
End Class
End Namespace
Class MainForm
Sub Example()
DLL.Utility.DLLFunction( New DataRetriever() )
End Sub
End Class