-1

我需要从包含一个 C# WinForms 项目的解决方案中引用 EmguCV。

同一个库有四个版本,即 x86 和 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 { }

现在在您现有的应用程序中,使用反射或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 回答