Fiber : DLL « Windows « C# / CSharp Tutorial






using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
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());
    }
}








29.11.DLL
29.11.1.Compile to dll
29.11.2.Fiber
29.11.3.Invoke MessageBox in Dll
29.11.4.Using load library from Dll
29.11.5.Call DLL API to move file
29.11.6.Marshal a function from Dll to a delegate