1 在SDK中有一个工具可将非受管代码转化成受管代码,
也就是METADATA,然后可以用同COM组件交互的方式访问DLL中的方法。
当然也可以用DLLIMPORT实现外部调用。
2
(注:调用自己写的Dll还有问题,总是无法找到入口点.待查)
1.非托管类(不需要CLR和.NetFramework支持)
使用C#时不免用调用别的DLL,如WIN32的API和自己以前做的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
文章评论(0条评论)
登录后参与讨论