走近COM Interop--编程以实现COM-->Assembly
2005-01-28 15:55
281 查看
这篇文章是《走近COM Interop》系列的最后一篇,也是涉及技术点最多的一篇。希望我的描述大家能看到懂private enum[/b] RegKind
注:上述类的说明来自MSDN。
大家都看到了,上述几个类中,仅有StrongNameKeyPair是可选的,这是因为如果我们不需要生成PIA,那么是不需要使用这个类的。同时,如果需要生成PIA,那么需要提供相应的密钥文件。在后面的描述中,我们将使用《走近COM Interop--浅谈PIA》中的例子做进一步的演示。
二、实战演练
在此,我们仍就由VB生成的PIADemo.dll展开演示。
1. 载入一个COM组件
Object typeLib;
LoadTypeLibEx("PIADemo.dll", RegKind.RegKind_None, out typeLib);
if(typeLib == null )
public class ConversionEventHandler: ITypeLibImporterNotifySink
3. 将COM类型库生成程序集
A. 生成PIA Assembly
FileStream stream = new FileStream("common.snk", FileMode.Open);
try
catch(Exception ep)
TypeLibConverter converter = new TypeLibConverter();
ConversionEventHandler eventHandler = new ConversionEventHandler();
AssemblyBuilder ab = converter.ConvertTypeLibToAssembly(typeLib, "interop.PIADemo.dll", 0,
eventHandler, null, null, null, null);
ab.Save("interop.PIADemo.dll");
MessageBox.Show("Importing is ok.");
Assembly asm = Assembly.LoadFile(Application.StartupPath + @"\interop.PIADemo.dll");
Type t = asm.GetType("interop.PIADemo.TestClass");
object obj = t.InvokeMember(null, BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.CreateInstance, null, null, null);
string ret = (string)t.InvokeMember("Format", BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic |
BindingFlags.Instance | BindingFlags.InvokeMethod, null, obj, new object[]{"Go!"});
MessageBox.Show(ret);
需要说明几点:
1. 上述示例中使用的PIADemo.dll和Common.snk都需要被copy至测试程序的bin目录中,否则,就需要指定可达到的文件路径。
2. Assembly.LoadFile的参数是要加载的文件的绝对路径,相对路径将会引发异常。
至此,本系列文章全部完成。因本人水平有限,有不对的地方,欢迎指正。
注:上述类的说明来自MSDN。
大家都看到了,上述几个类中,仅有StrongNameKeyPair是可选的,这是因为如果我们不需要生成PIA,那么是不需要使用这个类的。同时,如果需要生成PIA,那么需要提供相应的密钥文件。在后面的描述中,我们将使用《走近COM Interop--浅谈PIA》中的例子做进一步的演示。
二、实战演练
在此,我们仍就由VB生成的PIADemo.dll展开演示。
1. 载入一个COM组件
Object typeLib;
LoadTypeLibEx("PIADemo.dll", RegKind.RegKind_None, out typeLib);
if(typeLib == null )
public class ConversionEventHandler: ITypeLibImporterNotifySink
3. 将COM类型库生成程序集
A. 生成PIA Assembly
FileStream stream = new FileStream("common.snk", FileMode.Open);
try
catch(Exception ep)
TypeLibConverter converter = new TypeLibConverter();
ConversionEventHandler eventHandler = new ConversionEventHandler();
AssemblyBuilder ab = converter.ConvertTypeLibToAssembly(typeLib, "interop.PIADemo.dll", 0,
eventHandler, null, null, null, null);
ab.Save("interop.PIADemo.dll");
MessageBox.Show("Importing is ok.");
Assembly asm = Assembly.LoadFile(Application.StartupPath + @"\interop.PIADemo.dll");
Type t = asm.GetType("interop.PIADemo.TestClass");
object obj = t.InvokeMember(null, BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.CreateInstance, null, null, null);
string ret = (string)t.InvokeMember("Format", BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic |
BindingFlags.Instance | BindingFlags.InvokeMethod, null, obj, new object[]{"Go!"});
MessageBox.Show(ret);
需要说明几点:
1. 上述示例中使用的PIADemo.dll和Common.snk都需要被copy至测试程序的bin目录中,否则,就需要指定可达到的文件路径。
2. Assembly.LoadFile的参数是要加载的文件的绝对路径,相对路径将会引发异常。
至此,本系列文章全部完成。因本人水平有限,有不对的地方,欢迎指正。
相关文章推荐
- FW:走近COM Interop--编程以实现COM–>Assembly
- Office2000下内部COM插件的编程实现
- <com原理>与<com内幕>的聚合实现部分。
- 泛型<编程>:基于策略的basic_string实现
- C++ 编程实现 观察者模式--订阅模式-->初学者。
- Office2000下内部COM插件的编程实现
- 走近COM Interop--浅谈PIA
- 编程实现>ASP.NET 3.5会话控制>Cookie
- <p>在我们的实际软件项目中,管理团队事实上比写代码或者实现一个客户的需求更为的有挑战性。由于编程实际上是和机器打交道,而和机器打交道,仅仅要你符合机器预定的逻辑,</p>
- 三元组(a,b,c)标识a币种到b币种的汇率为c,反向亦成立。 输入一堆这样的三元组,再指定两个币种x y,问x->y的汇率是多少? 请编程实现,并给出时间、空间复杂度。
- <网络编程培训之七> 实现Traceroute
- 深入学习java并发编程:ThreadLocal<T>实现
- python扩展实现方法--python与c混和编程 转自:http://www.cnblogs.com/btchenguang/archive/2012/09/04/2670849.html
- VC++内部COM插件的编程实现
- 分布式编程->Remoting的一个代码示例(借助Remoting实现发送信息功能)
- <<UNIX环境高级编程>>学习总结——第二章:UNIX标准化及实现
- com/atl套间编程中如何实现定时invoke容器中的方法
- 【outlook plugin】Office2000下内部COM插件的编程实现 译者:徐景周
- <a>实现按钮的javascript+jquery编程实例
- 基于VS2008和Matlab R2010b版本的混合编程的实现(转自:http://blog.sina.com.cn/s/blog_49cb42490100nm5j.html)