C#中调用C#写的动态库BirtXml.dll通过pInvoke方式:
string strDllPath = "BirtXml.dll";

FileInfo fi = new FileInfo(strDllPath);
if(!fi.Exists)
{
MessageBox.Show("不存在文件:" +strDllPath );
return;
}
//加载到程序集
Assembly a = Assembly.LoadFrom(strDllPath);

//查找接口类型
Type[] types = a.GetTypes();
Type myType = null;
foreach(Type t in types)
{
if(t.Name == "CommonXml")  //类型应该统一
{
myType = t;
break;
}
}
//创建类型实例
if(myType == null)
{
return;
}
object obj = Activator.CreateInstance(myType);

MethodInfo method = myType.GetMethod("CreateXml", new Type[] {typeof(string)});object[] myRoot = new object[1]{"Para"};

bool bCreate = (bool)method.Invoke(obj, myRoot);//////*********************************************************************1、
使用method.Invoke这种方式很不直观,不查看代码不容易知道执行的是哪个方法
能否还有别的什么办法,可以方便的直接执行诸如: 接口.CreateXml(str)?是否是在BirtXml.dll中输出接口之类的东西.......:
***********************************************************************/////
interface IBritXml
{
//接口中定义的xml文档
XmlDocument XmlDoc
{
get;
} bool CreateXml(string root);
}public class BritXml:IBritXml
{
static XmlDocument m_doc = new XmlDocument();   //内存xml数据 public BritXml()
{

} //接口中定义的属性的具体实现
public XmlDocument XmlDoc
{
get
{
return m_doc;
}
} public bool CreateXml(string rootName)
{
        .......
}
....
}2、都有哪些调用动态库的方式??早绑定迟绑定....
HELP!!!!!!!!!    Thanks!!!

解决方案 »

  1.   

    但是如果你的类库中用了.net某些已知类型的话,可以通过as来转换。
      

  2.   

    但是如果你的类库中用了.net某些已知类型的话,可以通过as来转换。愿闻其详!!!比如谢谢Knight94.
      

  3.   

    比如你在类库中产生了一个xmldocument对象,那么通过InvokeMember返回的是一个object,那么可以通过as转换成xmldocument对象。
      

  4.   

    谢谢!
    但感觉和我的问题不一回事啊
    我的问题事使用method.Invoke这种方式很不直观,不查看代码不容易知道执行的是哪个方法
    能否还有别的什么办法,可以方便的直接执行诸如: 接口.CreateXml(str)?
      

  5.   

    回复的很快啊谢谢
    只有动态加载和静态加载这两种用法了?
    动态的必须Invoke?