请问各位大虾如何在C#中使用类似VB中CreateObject的功能通过类名创建对象的实例

rongpu 2003-01-24 08:53:18
注:
1.我并不知道该类在哪个dll文件中定义的;
2.在VB中只需要知道类名即可,如CreateObject("Geomedia.Eventserver")
...全文
119 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
曲滨_銘龘鶽 2003-01-24
  • 打赏
  • 举报
回复
/*新建一个Form工程添一个按钮双击按钮添加如下代码!
帮助 MSDN:ms-help://MS.VSCC/MS.MSDNVS.2052/cpguide/html/cpcondynamicallyloadingusingtypes.htm#cpcondynamicallyloadingusingtypes
MSDN 写的不是那么明了!
调用Excel的版本属性!
会看到Dll的GUID
看到 Excel 版本 就是 Version [obzty.InvokeMember("Version"...]属性
可根据GUID用Regedit去搜索到你的.DLL的物理为子
TlbIMp.exe 转换一下就不费事时了!
其实用VB.NET便个.NET动态连接库比较好
如果非要这么用C#太费尽了!
vb只用三行即可搞定!
Dim aa As Object
aa = CreateObject("Excel.Application")
MsgBox(aa.Version)*/

//一下是简单的代码!

private void button1_Click(object sender, System.EventArgs e)
{
BindingFlags flags = BindingFlags.GetProperty;
Type obzty =Type.GetTypeFromProgID("Excel.Application");
object md=Activator.CreateInstance(obzty);

MessageBox.Show( "GUID: "+obzty.GUID.ToString());

MessageBox.Show("Excel 版本" +obzty.InvokeMember("Version",flags,null,md,new Object[] {}).ToString());
}
qimini 2003-01-24
  • 打赏
  • 举报
回复
gz
Lostinet 2003-01-24
  • 打赏
  • 举报
回复
//下面的实现为IConvertible或依赖IConvertible的操作

//IConvertible
#region Implementation of IConvertible
public System.DateTime ToDateTime(System.IFormatProvider provider)
{
return (System.DateTime)this.ToType(typeof(System.DateTime),provider);
}

public bool ToBoolean(System.IFormatProvider provider)
{
return (bool)this.ToType(typeof(bool),provider);
}

public byte ToByte(System.IFormatProvider provider)
{
return (byte)this.ToType(typeof(byte),provider);
}
public sbyte ToSByte(System.IFormatProvider provider)
{
return (sbyte)this.ToType(typeof(sbyte),provider);
}
public char ToChar(System.IFormatProvider provider)
{
return (char)this.ToType(typeof(char),provider);
}
public short ToInt16(System.IFormatProvider provider)
{
return (short)this.ToType(typeof(short),provider);
}
public ushort ToUInt16(System.IFormatProvider provider)
{
return (ushort)this.ToType(typeof(ushort),provider);
}
public int ToInt32(System.IFormatProvider provider)
{
return (int)this.ToType(typeof(int),provider);
}
public uint ToUInt32(System.IFormatProvider provider)
{
return (uint)this.ToType(typeof(uint),provider);
}
public long ToInt64(System.IFormatProvider provider)
{
return (long)this.ToType(typeof(long),provider);
}
public ulong ToUInt64(System.IFormatProvider provider)
{
return (ulong)this.ToType(typeof(ulong),provider);
}
public decimal ToDecimal(System.IFormatProvider provider)
{
return (decimal)this.ToType(typeof(decimal),provider);
}
public float ToSingle(System.IFormatProvider provider)
{
return (float)this.ToType(typeof(float),provider);
}
public double ToDouble(System.IFormatProvider provider)
{
return (double)this.ToType(typeof(double),provider);
}
public string ToString(System.IFormatProvider provider)
{
return (string)this.ToType(typeof(string),provider);
}
#endregion

//Convert To
#region Convert
public System.DateTime ToDateTime()
{
return (System.DateTime)this.ToType(typeof(System.DateTime),null);
}

public bool ToBoolean()
{
return (bool)this.ToType(typeof(bool),null);
}

public byte ToByte()
{
return (byte)this.ToType(typeof(byte),null);
}
public sbyte ToSByte()
{
return (sbyte)this.ToType(typeof(sbyte),null);
}
public char ToChar()
{
return (char)this.ToType(typeof(char),null);
}
public short ToInt16()
{
return (short)this.ToType(typeof(short),null);
}
public ushort ToUInt16()
{
return (ushort)this.ToType(typeof(ushort),null);
}
public int ToInt32()
{
return (int)this.ToType(typeof(int),null);
}
public uint ToUInt32()
{
return (uint)this.ToType(typeof(uint),null);
}
public long ToInt64()
{
return (long)this.ToType(typeof(long),null);
}
public ulong ToUInt64()
{
return (ulong)this.ToType(typeof(ulong),null);
}
public decimal ToDecimal()
{
return (decimal)this.ToType(typeof(decimal),null);
}
public float ToSingle()
{
return (float)this.ToType(typeof(float),null);
}
public double ToDouble()
{
return (double)this.ToType(typeof(double),null);
}
#endregion


//static:

static public bool operator == (LateObject lo,object obj)
{
return lo.Equals(obj);
}
static public bool operator != (LateObject lo,object obj)
{
return !lo.Equals(obj);
}

static public implicit operator LateObject (ValueType obj)
{
return new LateObject(obj);
}
static public implicit operator LateObject (string obj)
{
return new LateObject(obj);
}
static public implicit operator LateObject (Delegate obj)
{
return new LateDelegate(obj);
}

static public LateObject operator ++ (LateObject o)
{
return o+1;
}

//double
#region double op
static public double operator + (LateObject obj,double d)
{
return obj.ToDouble()+d;
}
static public double operator + (double d,LateObject obj)
{
return d+obj.ToDouble();
}
static public double operator - (LateObject obj,double d)
{
return obj.ToDouble()-d;
}
static public double operator - (double d,LateObject obj)
{
return d-obj.ToDouble();
}
static public double operator * (LateObject obj,double d)
{
return obj.ToDouble()*d;
}
static public double operator * (double d,LateObject obj)
{
return d*obj.ToDouble();
}
static public double operator / (LateObject obj,double d)
{
return obj.ToDouble()/d;
}
static public double operator / (double d,LateObject obj)
{
return d/obj.ToDouble();
}
static public bool operator > (LateObject obj,double d)
{
return obj.ToDouble()>d;
}
static public bool operator > (double d,LateObject obj)
{
return d>obj.ToDouble();
}
static public bool operator < (LateObject obj,double d)
{
return obj.ToDouble()<d;
}
static public bool operator < (double d,LateObject obj)
{
return d<obj.ToDouble();
}
static public bool operator >= (LateObject obj,double d)
{
return obj.ToDouble()>=d;
}
static public bool operator >= (double d,LateObject obj)
{
return d>=obj.ToDouble();
}
static public bool operator <= (LateObject obj,double d)
{
return obj.ToDouble()<=d;
}
static public bool operator <= (double d,LateObject obj)
{
return d<=obj.ToDouble();
}
static public bool operator == (LateObject obj,double d)
{
return obj.ToDouble()==d;
}
static public bool operator != (LateObject obj,double d)
{
return obj.ToDouble()!=d;
}
#endregion

//create instance:
static public LateObject FromProgID(string progid)
{
System.Type t=Type.GetTypeFromProgID(progid,true);
return new LateObject(Activator.CreateInstance(t));
}
}
}
Lostinet 2003-01-24
  • 打赏
  • 举报
回复
帖个主文件。有兴趣的可以看看。
(不过第二次做的时候应该改变很大了。会把LateMember和LateIndexer等合并起来。.把this[]改完善:)

using System;
using System.Collections;
using System.Reflection;
using System.Text;

namespace Lostinet.LateBinding
{
public class LateObject:IConvertible
{
protected object m_obj;
public LateObject(object bindingObj)
{
m_obj=bindingObj;
}

//base
public override bool Equals(object obj)
{
object v=Value;
if(obj==null)
return v==null;
if(obj is LateObject)
{
try
{
return object.Equals(v,((LateObject)obj).Value);
}
catch
{
return false;
}
}
return object.Equals(v,obj);
}
public override int GetHashCode()
{
object v=Value;
if(v==null)
return 0;
return v.GetHashCode();
}
public override string ToString()
{
object v=Value;
if(v==null)
return "<null>";
return v.ToString();
}

//[]
protected virtual LateObject Internal_GetItem(params object[] objs)
{
object v=Value;
if(v==null)
throw(new ObjectNullException());
if(objs.Length!=1)
throw(new ArgumentException("只接受一个string参数"));
objs=TransformLateObject(objs);
string name=objs[0] as string;
if(name==null)
throw(new ArgumentNullException("第一个参数必须为string,而且不能为空"));
return new LateMember(v,name);
}
protected virtual void Internal_SetItem(LateObject value,params object[] objs)
{
object v=Value;
if(v==null)
throw(new ObjectNullException());
if(objs.Length!=1)
throw(new ArgumentException("只接受一个string参数"));
objs=TransformLateObject(objs);
string name=objs[0] as string;
if(name==null)
throw(new ArgumentNullException("第一个参数必须为string,而且不能为空"));
System.Type t=v.GetType();
System.Type mt=GetMemberType(t,name);
object thevalue=value.Value;
if(thevalue!=null&&mt!=null&&!mt.IsInstanceOfType(thevalue))
{
if(mt.IsSubclassOf(typeof(IConvertible)))
{
thevalue=Convert.ChangeType(thevalue,mt);
}
}
t.InvokeMember(name,BindingFlags.Instance|BindingFlags.Public|BindingFlags.SetProperty|BindingFlags.SetField,null,v,new object[]{thevalue});
}
static protected Type GetMemberType(System.Type t,string name)
{
MemberInfo[] mis=t.GetMember(name,MemberTypes.Field|MemberTypes.Property,BindingFlags.Instance|BindingFlags.Public);
if(mis.Length==0)
return null;
MemberInfo mi=mis[0];
if(mi is FieldInfo)
return ((FieldInfo)mi).FieldType;
if(mi is PropertyInfo)
return ((PropertyInfo)mi).PropertyType;
return null;
}
public LateObject this[params object[] objs]
{
get
{
return Internal_GetItem(objs);
}
set
{
Internal_SetItem(value,objs);
}
}
public LateObject InvokeMethod(string name,params object[] objs)
{
object v=Value;
objs=TransformLateObject(objs);
return new LateObject(v.GetType().InvokeMember(
name
,BindingFlags.Instance|BindingFlags.Public|BindingFlags.InvokeMethod
,null,v,objs)
);
}
public virtual LateObject Invoke(params object[] objs)
{
object v=Value;
if(v is Delegate)
return new LateDelegate((Delegate)v).Invoke(objs);
throw(new NotImplementedException());
}
public virtual object Value
{
get{return m_obj;}
}
public LateObject Indexer
{
get
{
return new LateIndexer(Value);
}
}
static protected object[] TransformLateObject(object[] objs)
{
object[] objs2=objs.Clone() as object[];
for(int i=0;i<objs.Length;i++)
{
if(objs[i] is LateObject)
{
objs2[i]=((LateObject)objs[i]).Value;
}
}
return objs2;
}

public virtual System.Type Type
{
get
{
object v=Value;
if(v==null)
return typeof(void);
return v.GetType();
}
}

static public LateObject operator + (LateObject lhs,LateObject rhs)
{
object v1=lhs.Value;
object v2=rhs.Value;
if(v1==null)
return rhs;
if(v2==null)
return lhs;
if(v1.GetType().IsValueType)
{
try
{
return lhs.ToDouble()+rhs.ToDouble();
}
catch{}
}
MethodInfo mi=v1.GetType().GetMethod("op_Addition",BindingFlags.Static|BindingFlags.Public);
if(mi!=null)
return new LateObject(mi.Invoke(null,new object[]{lhs,rhs}));
return v1.ToString()+v2.ToString();
}
static public LateObject operator - (LateObject lhs,LateObject rhs)
{
throw(new NotImplementedException());
}

//实现IConvertible时,可重写的部分

public virtual TypeCode GetTypeCode()
{
IConvertible c=(Value as IConvertible);
if(c!=null)return c.GetTypeCode();
return TypeCode.Object;
}

public virtual object ToType(System.Type t,IFormatProvider p)
{
IConvertible c=(Value as IConvertible);
if(c!=null)return c.ToType(t,p);
if(t==typeof(double))
return double.NaN;
if(t==typeof(float))
return float.NaN;
throw(new ConvertibleException());
}


Lostinet 2003-01-24
  • 打赏
  • 举报
回复
:)
我写了个方便C#进行后期绑定的LateObject,,
因为现在还很不成熟,我打算春节回来修改一下再帖..
使用情况具体是:


LateObject ie=LateObject.FromProgID("InternetExplorer.Application");

ie["Visible"]=true;
ie["AddressBar"]=false;
ie["MenuBar"]=false;
ie["ToolBar"]=false;
ie["Navigate2"].Invoke("http://www.google.com/");

Console.WriteLine("按回车继续...");
Console.ReadLine();

LateObject style=ie["Document"]["body"]["style"];
style["overflow"]="hidden";
style["borderWidth"]="0px";
style["backgroundColor"]="bisque";
ie["Document"]["body"].InvokeMethod("insertAdjacentHTML","beforeEnd","<span> <script defer=false>document.f.q.value='CSharp Late Binding';document.f.submit()</script><span>");
rongpu 2003-01-24
  • 打赏
  • 举报
回复
1.我并不知道该类在哪个dll文件中定义的;
2.这个类不是我写的;
3.是个com对象,但在工程的com引用中又找不到;
4.我知道它一定能用,因为在VB中使用CreateObject("Geomedia.EventServer")能成功。
saucer 2003-01-24
  • 打赏
  • 举报
回复
System.Type t = System.Type.GetType("YourNamespace.YourClassName");
object o = Activator.CreateInstance(t);

or

System.Reflection.Assembly a= System.Reflection.Assembly.LoadFrom("AssemblyName");//if you need the assembly name
object o = a.CreateInstance("YourNamespace.YourClassName");
win32c 2003-01-24
  • 打赏
  • 举报
回复
new class(参数)
bbwolf 2003-01-24
  • 打赏
  • 举报
回复
protected override void OnClick(System.EventArgs e)
{
try
{
if(_Click != null&&_Dll!=null)
{
Type CallType = Type.GetTypeFromProgID(_Dll);
if(CallType!=null)
{
object CallObj = Activator.CreateInstance(CallType);
System.Reflection.MethodInfo CallIt = CallType.GetMethod(_Click);
if(CallIt!=null)
{
object rt = CallIt.Invoke(CallObj,_CallParam);
}
}
}
base.OnClick(e);
}
catch(System.Exception err)
{
System.Windows.Forms.MessageBox.Show(err.Message,"系统错误");
}
}

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧