介绍
由于我的边栏小工具介绍写作,我一直在摔跤,不能够做到与小工具,可以很容易地使用。NET做的挫折。我爱紧凑和简单的小工具就可以了,但我觉得很难建立一个真正有用的小工具,只需使用JavaScript,因为没有真正的权力。不幸的是,。NET社区,小工具几乎完全依赖于JavaScript。很难搭配其庞大的局限性小玩意我兴奋。如果我能运行。NET代码从小玩意输入小工具。NET互操作!在这篇文章中,我们将探讨如何建立一个小工具和。NET之间的互操作层,这样你就可以任何从你的侧边栏小工具的运行。NET代码 。我们将通过建立一个C#项目,以读取您的Gmail收件箱。COM和ActiveX,这是不公平的说,小工具不能运行。NET代码。事实是,它很容易从脚本语言创建COM对象实例。真正的问题是,它的可怕的不方便注册所有的COM互操作的代码 。这样做会要求你先修改所有的代码是COM兼容。然后,你不得不重新包装你的代码和分发MSI文件,连同每个小工具安装和注册您的程序集(也可能是将它添加到GAC中,如果它要在整个小工具共享)。那一种解决方法是不是一个现实的解决方案,特别是如果你已经有了,你不想重写,只是为COM Interop包的代码。此外,你不能假设你的用户拥有的知识或权限来安装一个COM组件。然后答案是什么?无论什么,就必须有一些COM件到位,否则我们将永远不会过去的JavaScript的局限性 。一旦我们有了一个合适的COM层(见下文如果你舒适。NET中的COM),我们将在Gmail的部分。让我们开始真正的螺母和螺栓的解决方案可用于加载任何。NET程序集创建一个基本的COM对象。NET的COM对象怎样做的详情,请参阅这篇文章。NET COM接口的想法很简单,创建一个小型化,轻量化NET的COM组件,它使用反射来加载任何集会和类型。然后,该类型可以从JavaScript直接调用。让我们看的“小工具适配器”,会做大量的工作在接口 。
[ComVisible(TRUE),
GuidAttribute(“B4BC 618ACBAF - 4165 - 8689 - A0B7D7115B05”),
InterfaceType(ComInterfaceType.InterfaceIsDual)]
公共接口IGadgetInterop
{
LoadType对象(assemblyFullPath字符串,字符串的className);
对象LoadTypeWithParams(assemblyFullPath字符串,字符串的className,
BOOL preserveParams);
无效AddConstructorParam(对象参数);
无效UnloadType(对象typeToUnload);
}
只有四种方法,实施小工具适配器类将需要处理。要注意的一点是,该接口有三个属性,将使我们能够实现类作为COM对象暴露 。四种方法,我们需要创建和调用在托管代码中的任何类型。 小工具 适配器现在该接口定义,让我们来看看实际的小工具,这个接口的适配器实现。我们将打破它件件与类的属性开始。
[ComVisible(TRUE),
GuidAttribute(“89BB4535 5AE9 - 43a0 - 89C5 - 19B4697E5C5E”),
PROGID(“GadgetInterop.GadgetAdapter”),
ClassInterface(ClassInterfaceType.None)]
公共类GadgetAdapter:IGadgetInterop
{
... ...
}
有这些属性和属性之间的一个接口上的一些差异。我们的目的,最重要的属性是“PROGID”属性。此属性表示的字符串,我们将使用通过JavaScript创建ActiveX对象。现在,GadgetAdapter装饰,下一步是加载程序集并创建类的实例。AddConstructorParam方法允许JavaScript代码来添加,将传递给类构造函数的参数的值。这是只有必要时要加载的。NET类型,使用一个或多个参数的构造函数。
ArrayList的私人paramList =新的ArrayList();
公共无效AddConstructorParam(对象参数)
{
paramList.Add(参数);
}
下一个方法是所有魔法发生的地方。LoadTypeWithParams方法有三个参数,允许任何。NET程序集加载。该方法需要向大会的路径,创建的类型,和处理构造函数的参数处理的一个单位。
公共对象LoadTypeWithParams(assemblyFullPath字符串,字符串的className,
BOOL preserveParams)
{
... ...
大会大会= Assembly.LoadFile(assemblyFullPath);
对象[]参数= NULL;
(paramList!= NULL&&paramList.Count> 0)
{
参数=新对象[paramList.Count];
paramList.CopyTo(参数);
}
的BindingFlags绑定= BindingFlags.CreateInstance |
BindingFlags.Instance |
BindingFlags.Public;
对象loadedType = assembly.CreateInstance(类名,假的,绑定,
空,参数,CultureInfo.InvariantCulture
NULL);
... ...
返回loadedType;
}
使用标准。NET反射,指定的程序集加载和创建输入类型的一个实例 。返回该实例,然后通过JavaScript直接调用(来)。preserveParams标志,防止被清除的对象被创建后,构造函数的参数。这仅仅是必要的,当你创建多个实例的一类具有相同的构造函数的参数。最后,因为我们是在COM世界,我们必须要小心,做我们自己的对象处理。UnloadType方法调用处理传入的对象,让优美的清理
公共无效UnloadType(对象typeToUnload)
{
... ...
(typeToUnload = NULL&&typeToUnload IDisposable接口)
{
(为IDisposable接口typeToUnload)的Dispose();
typeToUnload = NULL;
}
赶上{}
... ...
}
我选择了一个公约是暴露小工具类必须实现该接口将与示例代码实现IDisposable,因此,只有类型。这是所有有Interop层。NET对象创建和它破坏NET对象;。而已,无所不及