第一种:在工程中引用,这种方法快捷,但问题很多;
第二种:使用Type和Activator来创建一个com对象
首先应引入库using System.Runtime.InteropServices;
然后在需要的地方加入如下:
Type type = Type.GetTypeFromProgID("AMediaPlayer.Player");
或
{
Guid clsid = new Guid();
int hr = CLSIDFromProgID("AMediaPlayer.Player", ref clsid);
Type type = Type.GetTypeFromCLSID(clsid); //此处的guid应该是(CLSID associated with the data and code),否则会报错
}
object obj = Activator.CreateInstance(type);
IPlayer pPlayer = obj as IPlayer; //IPlayer 是个接口
然后就可以使用pPlayer对象了
这里要注意的就是上面那两个函数的用法,CLSIDFromProgID 和GetTypeFromProgID。上面都写的应该清楚了;
第三种:使用CoCreateInstance来创建一个实例
首先也要引入using System.Runtime.InteropServices;
然后在类中
[DllImport("ole32.dll", ExactSpelling = true)]
private static extern int CoCreateInstance(
[In] ref Guid clsid,
IntPtr pUnkOuter,
uint context,
[In] ref Guid iid,
[Out] out IntPtr ppv);
[DllImport("ole32.dll", ExactSpelling = true)]
private static extern int CLSIDFromProgID(
[MarshalAs(UnmanagedType.LPWStr)] string progid,
ref Guid clsid);
以上应该是代理,具体概念不知道,本是搞c++的。
Guid clsid = new Guid();
int hr = CLSIDFromProgID("AMediaPlayer.Player", ref clsid); //CLSID associated with the data and code
Guid idispatch_id = new Guid("3A2A90D6-1255-4D5C-86C0-B8694B712C66");//这个是接口guid
IntPtr pIDispatch;
hr = CoCreateInstance(ref clsid,IntPtr.Zero,1, // CLSCTX_INPROC_SERVER
ref idispatch_id,
out pIDispatch);
object obj = Marshal.GetObjectForIUnknown(pIDispatch);
IPlayer pPlayer = obj as IPlayer; //IPlayer 是个接口
这三种都测试过了,都能用,第二种是最方便的。可能有些地方会写漏,但大概是这样的