原创 在c#中如何调用其他语言写的DLL汇总

2009-4-3 16:44 3466 6 3 分类: 软件与OS

1 在SDK中有一个工具可将非受管代码转化成受管代码,

也就是METADATA,然后可以用同COM组件交互的方式访问DLL中的方法。

当然也可以用DLLIMPORT实现外部调用。


2



(:调用自己写的Dll还有问题,总是无法找到入口点.待查)


1.非托管类(不需要CLR.NetFramework支持)


使用C#时不免用调用别的DLL,如WIN32API和自己以前做的DLL 

C#
调用DLL很像VB,下面讨论的C#调用DLL的方式。
 

看看下面的例子,演示了怎么定义DLL函数接口
 

public class Utility 



   [DllImport("kernel32", 

EntryPoint=”CreateDirectory”, 

CallingConvention=CallingConvention.StdCall] 

   public static extern bool Create (string name); 

  

   [DllImport("User32"] 

EntryPoint=”MessageBox”, 

CallingConvention=CallingConvention.StdCall] 

   public static extern int MsgBox (string msg); 



  

class MyClass 



   public static int Main() 

   { 

      string myString; 

      Console.Write("Enter your message: "); 

      myString = Console.ReadLine(); 

      return Utility.MsgBox(myString); 

   } 



  

值得注意的是,缺省的调用规则(CallingConvention)Stdcall,同Winapi,在
 

C++
里是__stdcall的形式,函数入口(EntryPoint)缺省是同名,如
CreateDirectory 

的定义也可以为
 

   [DllImport("kernel32")] 

   static extern bool CreateDirectory(string name, SecurityAttributes sa); 

  

WIN32 API
原型为
 

BOOL CreateDirectory( 

  LPCTSTR lpPathName,                         // directory name 

  LPSECURITY_ATTRIBUTES lpSecurityAttributes  // SD 

); 

  

在调用WIN32 API时注意那些类型的转换,如结构(struct)、指针(pointer) 


有关各种语言之间类型转换和DllImport属性的详细信息可以参考SDK文档  


2.托管类


Assmebly调用


: Assembly   clientassembly   =   

      Assembly.LoadFrom(
@"\dll\CommInfoQuery.dll");       

      Form clientform   =   

    (Form)clientassembly.CreateInstance("JHManage.CommInfoQueryForm");

      clientform.Show();





3 调用标准的DLL


在c#里只需要调用pinvoke (platform invocation) 服务。c# 支持一种sysimport属性

支持这种调用。

下面是完整的语法形式(在例子里没有用到所有的参数):



[sysimport(

dll=dllname,

name=functionname,

charset=charactersettobeused)

]



给出一个调用win32 messagebox函数的例子:



using system;



class pinvokeclient

{

[sysimport(dll="user32.dll")]



public static extern int messageboxa(int hwnd, string message,

string caption, int type);



public static void main()

{

int result = messageboxa(0, "hello world", "pinvoke test", 0);

}

}

文章评论0条评论)

登录后参与讨论
我要评论
0
6
关闭 站长推荐上一条 /2 下一条