.NET组件和COM组件的不同之处
.NET组件可以分为两大类:共享的.NET组件和私有的.NET组件。
共享的.NET组件需要通过标准公开关键字密码技术来保证自身的唯一性,在这一点上面比较类似于COM的全球唯一ID号码GUID。但是,我们在可能的情况下应当尽量避免使用共享的.NET组件,因为这样将会有可能再一次的陷入目前在视窗系统下长期困扰开发人员的“DLL地狱”。
私有的.NET组件是我们将会经常使用的.NET组件方式,在这种方式之下,我们发布.NET组件需要做的只是简单的进行拷贝操作就可以了,仿佛回到了远古的DOS时代了,在也不必关心纷繁复杂的系统注册表了,也不必担心DLL的版本被覆盖等等的问题了。
而COM组件是微软曾经力推了很多年的一种代码复用的技术框架,在这些年里也得到了极大的发展和应用,但它的弊端却也日益明显,我们不得不面对众多的COM组件之间的版本控制和令人恐怖的DLL地狱,还有注册表、GUID等等。在我们安装一个软件的同时,也带来了大量的我们所未知的版本繁多的COM组件到我们的操作系统中。
但是,COM组件的技术优势也是明显的,在很大的程度上实现了Windows平台下的代码复用,所以我们才会提出这样的一个话题,如何才能在.NET技术日臻成熟的情况下,保护和利用已经存在的大量的采用COM技术的软件和产品呢?
.NET组件
创建"类库"项目
Class1.cs改为Main.cs
不使用namespace
using System.Runtime.InteropServices;
public unsafe interface IOMPmSADataSourceAdapterCS
{
long Initialize(string path, ulong dwFlags);
long GetMediaFileSize();
long ReadMediaFile(
byte* buffer,
long position,
int size,
out uint numberOfBytesRead
);
void Dispose();
}
[ClassInterface(ClassInterfaceType.None)]
public class OMPmSADataSourceAdapterCS : IOMPmSADataSourceAdapterCS
{
//实现IOMPmSADataSourceAdapterCS中定义的方法
}
在"解决方案资源管理器"的项目上点右键属性,修改配置属性中"生成"中的"为com interop注册"为"true"
using System.Runtime.InteropServices;
public unsafe interface IOMPmSADataSourceAdapterCS
{
long Initialize(string path, ulong dwFlags);
long GetMediaFileSize();
long ReadMediaFile(
byte* buffer,
long position,
int size,
out uint numberOfBytesRead
);
void Dispose();
}
[ClassInterface(ClassInterfaceType.None)]
public class OMPmSADataSourceAdapterCS : IOMPmSADataSourceAdapterCS
{
//实现IOMPmSADataSourceAdapterCS中定义的方法
}
在"解决方案资源管理器"的项目上点右键属性,修改配置属性中"生成"中的"为com interop注册"为"true"
生成强名称xxx.snk
在项目的AssemblyInfo.cs中修改配置:
[assembly: AssemblyDelaySign(false)]
#if BuildByCommandLine
[assembly: AssemblyKeyFile("OMPmSADSPluginInteropLib.snk")]
#else
[assembly: AssemblyKeyFile("..//..//OMPmSADSPluginInteropLib.snk")]
#endif
[assembly: AssemblyKeyName("OMPmSADSPluginInteropLib")]
编译后会自动注册改dll,同时会生成xxx.tlb