C# A.dll을 하나 만들고, C# Main에서 A.dll을 참조하여 사용하는 프로그램에서

A.dll에서 delegate를 클래스로 제공하고

Main에서 A.dll에서 제공하는 클래스의 delegate 함수에 등록 후

A.dll의 함수를 사용하여 Main의 함수를 구동하고자 한다.

 

// SC Manager라는 Class Library를 만들며,

// 이안에는 delegate 함수 포인터 사용을 위한 생성부와

// Start() 함수를 이용한 Thread 구동 방법이 있다.

// Sc_Manager.dll 내부 구조

public class Sc_Manager
{
Thread m_ScThreadID = null;

// USER에게 제공해 주기 위한 함수 포인터 선언.
public delegate void ScReg();
public ScReg[] Sc_Mng;
public int Sc_MaxCnt = 0;
public string Sc_Name = string.Empty;
public bool bStillAlive = false;

public Sc_Manager(int nScCnt = 1)
{
Sc_MaxCnt = nScCnt;

// Scenario 개수만큼 함수포인터 생성
Sc_Mng = new ScReg[Sc_MaxCnt];
}

public bool Start()
{
if (bStillAlive == true) return true;

if (m_ScThreadID != null)
{
m_ScThreadID.Abort();
m_ScThreadID = null;
}

m_ScThreadID = new Thread(Run_ScenarioThreading);
m_ScThreadID.Start();

return true;
}

// threading processing.
void Run_ScenarioThreading()
{
bool nExecute = true;

do
{
if (bStillAlive == true) break;

bStillAlive = true;

int nMaxCnt = Sc_MaxCnt;
for (int SCnt = 0; SCnt < nMaxCnt; SCnt++)
{
// 본 프레임워크에서 함수 포인터로 함수를 실행시켜야 한다.
if (Sc_Mng[SCnt] != null)
Sc_Mng[SCnt]();
}

bStillAlive = false;
break;

} while (nExecute);
}
}

 

// 상기 Sc_Manager.dll을 사용하는 Main 부

private void btnLoadSc_Click(object sender, EventArgs e)
{
// Create Scenario Manager
Sc_Manager Scenario = new Sc_Manager(1);
Scenario.Sc_Name = "LoadControllers";
Scenario.Sc_Mng[0] = new Sc_Manager.ScReg(Load_Step_1);
Scenario.Start();
}

 

delegate를 활용하니 참 좋당^^

 

 

+ Recent posts