Csharp/CSharp Tutorial/Windows/DLL
Версия от 15:31, 26 мая 2010; (обсуждение)
Содержание
Call DLL API to move file
using System;
using System.IO;
using System.Runtime.InteropServices;
class Tester
{
[DllImport("kernel32.dll", EntryPoint = "MoveFile",ExactSpelling = false, CharSet = CharSet.Unicode,SetLastError = true)]
static extern bool MoveFile(string sourceFile, string destinationFile);
public static void Main()
{
ExploreDirectory(new DirectoryInfo("c:\\"));
}
private static void ExploreDirectory(DirectoryInfo dir)
{
string newDirectory = "newTest";
DirectoryInfo newSubDir =dir.CreateSubdirectory(newDirectory);
FileInfo[] filesInDir = dir.GetFiles();
foreach (FileInfo file in filesInDir)
{
string fullName = newSubDir.FullName + "\\" + file.Name;
file.CopyTo(fullName);
Console.WriteLine(file.FullName);
}
filesInDir = newSubDir.GetFiles();
int counter = 0;
foreach (FileInfo file in filesInDir)
{
string fullName = file.FullName;
if (counter++ % 2 == 0)
{
Tester.MoveFile(fullName, fullName + ".bak");
Console.WriteLine("{0} renamed to {1}",fullName, file.FullName);
}else{
file.Delete();
Console.WriteLine("{0} deleted.",fullName);
}
}
newSubDir.Delete(true);
}
}
Compile to dll
// compile with: csc /r:..\logdriver.dll /target:library logaddintofile.cs
using System;
using System.Collections;
using System.IO;
public class LogAddInToFile
{
StreamWriter streamWriter;
public LogAddInToFile()
{
streamWriter = File.CreateText(@"logger.log");
streamWriter.AutoFlush = true;
}
public void Log(string message)
{
streamWriter.WriteLine(message);
}
}
Fiber
using System;
using System.Drawing;
using System.Collections;
using System.ruponentModel;
using System.Windows.Forms;
using System.Data;
using System.Runtime.InteropServices;
using System.Threading;
using System.Diagnostics;
public class fmrFibers : System.Windows.Forms.Form {
private System.Windows.Forms.ListBox lstFibers;
[DllImport("kernel32.dll")]
extern static IntPtr ConvertThreadToFiber(int fiberData);
[DllImport("kernel32.dll")]
extern static IntPtr CreateFiber(int size, System.Delegate function, int handle);
[DllImport("kernel32.dll")]
extern static IntPtr SwitchToFiber(IntPtr fiberAddress);
[DllImport("kernel32.dll")]
extern static void DeleteFiber(IntPtr fiberAddress);
[DllImport("kernel32.dll")]
extern static int GetLastError();
delegate void SetTextOutputToEventLog(int number);
public fmrFibers() {
this.lstFibers = new System.Windows.Forms.ListBox();
this.SuspendLayout();
this.lstFibers.Size = new System.Drawing.Size(320, 212);
this.ResumeLayout(false);
Thread t1 = new Thread(new ThreadStart(NewThreadToFiberExecution));
t1.Start();
}
void OutputLog(int fiberNumber) {
this.Invoke(new AddToListBox(SetText), new object[] { fiberNumber });
SwitchToFiber(obj);
}
void SetText(int message) {
lstFibers.Items.Add("Fiber " + message.ToString() + " added this");
}
delegate void AddToListBox(int message);
System.IntPtr obj;
void NewThreadToFiberExecution() {
try {
SetTextOutputToEventLog stof = new SetTextOutputToEventLog(OutputLog);
obj = ConvertThreadToFiber(0);
long l1 = GetLastError();
System.IntPtr retVal1 = CreateFiber(500, stof, 1);
if (GetLastError() != 0) throw new Exception("Create Fiber failed!!");
IntPtr fiber1return = SwitchToFiber(retVal1);
if (GetLastError() != 0) throw new Exception("Create Fiber failed!!");
DeleteFiber(retVal1);
} catch (Exception e) {
throw e;
}
}
[STAThread]
static void Main() {
Application.Run(new fmrFibers());
}
}
Invoke MessageBox in Dll
using System;
using System.Runtime.InteropServices;
using System.Collections.Generic;
using System.Text;
class Program
{
[DllImport("user32.dll")]
public static extern int MessageBox(IntPtr hwnd, String text, String caption, uint type);
static void Main(string[] args)
{
MessageBox(new IntPtr(0), "Greetings from Platform Invoke", "Platform Invoke", 0);
}
}
Marshal a function from Dll to a delegate
using System;
using System.Threading;
using System.Runtime.InteropServices;
using System.Collections.Generic;
using System.Text;
class Program
{
[DllImport("kernel32.dll")]
static extern IntPtr LoadLibrary(string dllName);
[DllImport("kernel32.dll")]
static extern IntPtr GetProcAddress(IntPtr hModule, string procName);
delegate int MessageBoxDelegate(IntPtr hwnd,
[MarshalAs(UnmanagedType.LPWStr)]string text,
[MarshalAs(UnmanagedType.LPWStr)]string caption,
int type);
static void Main(string[] args)
{
IntPtr userApi = LoadLibrary("user32.dll");
IntPtr msgBoxAddress = GetProcAddress(userApi, "MessageBoxW"); // unicode (wide) message box
MessageBoxDelegate mbd = (MessageBoxDelegate)Marshal.GetDelegateForFunctionPointer(msgBoxAddress,typeof(MessageBoxDelegate));
mbd(IntPtr.Zero, "A", "B", 0);
DoSomething(mbd);
}
static void DoSomething(MessageBoxDelegate mbd)
{
mbd(IntPtr.Zero, "Work completed.", "Work Progress", 0);
}
}
Using load library from Dll
using System;
using System.Threading;
using System.Runtime.InteropServices;
using System.Collections.Generic;
using System.Text;
class Program
{
[DllImport("kernel32.dll")]
static extern IntPtr LoadLibrary(string dllName);
[DllImport("kernel32.dll")]
static extern IntPtr GetProcAddress(IntPtr hModule, string procName);
delegate int MessageBoxDelegate(IntPtr hwnd,
[MarshalAs(UnmanagedType.LPWStr)]string text,
[MarshalAs(UnmanagedType.LPWStr)]string caption,
int type);
static void Main(string[] args)
{
IntPtr userApi = LoadLibrary("user32.dll");
IntPtr msgBoxAddress = GetProcAddress(userApi, "MessageBoxW"); // unicode (wide) message box
MessageBoxDelegate mbd = (MessageBoxDelegate)Marshal.GetDelegateForFunctionPointer(msgBoxAddress,typeof(MessageBoxDelegate));
mbd(IntPtr.Zero, "A", "B", 0);
DoSomething(mbd);
}
static void DoSomething(MessageBoxDelegate mbd)
{
mbd(IntPtr.Zero, "Work completed.", "Work Progress", 0);
}
}