-1

1つのC#WinFormsプロジェクトを含むソリューションからEmguCVを参照する必要があります。

同じライブラリには4つのバージョンがあります。つまりx86vとx64で、それぞれGPUサポートがある場合とない場合があります。ライブラリには、EmguCVのマネージDLLとOpenCVのアンマネージDLLへの参照が必要です。[Bin]ビルド後のイベントを使用すると、管理されていない正しいバージョンをフォルダーにコピーするのは簡単です。

コードを介して管理対象参照を簡単に切り替えられるようにしたいと考えています。たぶん次のようなものです:

public enum EnumEmguCvTarget
{
    None, // Do not use EmguCv
    EmguCvTargetTbb86, // Target EmguCv for x86 without GPU.
    EmguCvTargetGpu86, // Target EmguCv for x86 with GPU.
    EmguCvTargetTbb64, // Target EmguCv for x64 without GPU.
    EmguCvTargetGpu64, // Target EmguCv for x64 with GPU.
}

public EnumEmguCvTarget EmguCvTarget
{ get { return (EnumEmguCvTarget.EmguCvTargetGpu64); } }

コンパイル時に(遅延バインディングではなく)これらのアセンブリを参照しているので、?の値に基づいてプログラムでバージョンを切り替える方法はあり[EmguCvTarget]ますか?

4

1 に答える 1

1

ステップ1:使用しているオブジェクトのインターフェースを作成し、EmguCvそれらを別のAnyCpuプロジェクトに配置します。これらのオブジェクトに共通のインターフェースがない場合、またはこれらのオブジェクトを変更できない場合は、これらのクラス用に独自のラッパーオブジェクトを作成する必要があります。独自のすべてのコードからこのアセンブリを参照するため、これらのインターフェイスを独自のアセンブリで定義することが重要です。

 public interface IEmguCv{ /* methods and proeprties */ }
 public class EmguCv : IEmguCv { }

既存のアプリケーションで、Reflectionを使用するかActivator.CreateInstance、正しいアセンブリをロードします。

 // which assembly to load depends on your configuration
 Assembly emguAssembly = Assembly.Load("EmguX64");
 Type emguType = emguAssembly.GetType("EmguCvClassYouAddedInterfacesTo");
 IEmguCv object = (IEmguCv)Activator.CreateInstance(emguType);

ここから、IEmguCvインターフェイスを使用できます。これにより、強力なバインディング、IntelliSense、およびその他の期待されるすべてのものが提供されますが、現在のコンテキストに基づいてアセンブリを動的にロードできます。

EmguCvオブジェクトでデフォルト以外のコンストラクターを呼び出す必要がある場合は、Activator.CreateInstance(Type, Object[], Object[])オーバーロードを使用するか、を介してコンストラクターを呼び出すことができますType.GetConstructor(Type[]).Invoke()

インターフェイスを定義したら、UnityやNInjectなどのライブラリを使用して、これらのDIコンテナを使用してリフレクション作業を実行することもできます。

于 2013-01-14T14:07:39.323 に答える