C#如何在程序启动时调用一些方法

时间:2014-01-21 04:06:15

标签: c# mono

如何在C#(mono)中启动程序时调用某些方法。 e.g。

fileA.cs

class some_class_a: IWorker {
    void should_be_called_at_startup() {
        ClassFactory.Instance.RegisterClass(myguid, myCreator);
    }
}

fileB.cs

class some_class_b: IWorker {
    void should_be_called_at_startup() {
        ClassFactory.Instance.RegisterClass(myguid, myCreator);
    }
}

我不想明确引用“some_class_a.should_be_called_at_startup”或“some_class_b.should_be_called_at_startup”,因为调用者不知道这些文件(类)是否存在。

这可能吗?

1 个答案:

答案 0 :(得分:0)

CIL(通用中介语言)只允许每个程序集上有一个入口点,因此如果不在类构造函数或Main方法上添加一些代码,就无法自动启动。

最好的方法应该是创建一个接口IRunAtStartup,并在应用程序入口点(主要/构造函数)上使用反射来查找所有实现并运行,正如@DavidKhaykin所说。

看看:

// Metadata version: v2.0.50727
.assembly extern mscorlib
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )            // .z\V.4..
  .ver 2:0:0:0
}
.assembly HelloCLR
{
  .custom instance void [mscorlib]System.Runtime.CompilerServices...
  .custom instance void [mscorlib]System.Runtime.CompilerServices...

  .hash algorithm 0x00008004
  .ver 0:0:0:0
}
.module HelloCLR.exe
// MVID: {14AAFB90-AC8E-4A34-84CB-1B9D2888C6E2}
.imagebase 0x00400000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003       // WINDOWS_CUI
.corflags 0x00000001    //  ILONLY
// Image base: 0x032C0000


// =============== CLASS MEMBERS DECLARATION ===================

.class private auto ansi beforefieldinit HelloCLR
   extends [mscorlib]System.Object
{
 .method public hidebysig static void  Main() cil managed
 {
  .entrypoint
  // Code size       23 (0x17)
  .maxstack  8
  IL_0000:  nop
  IL_0001:  ldstr      "Hello CLR {0}!"
  IL_0006:  call       class [mscorlib]System.Version 
                      [mscorlib]System.Environment::get_Version()
  IL_000b:  callvirt   instance string 
                      [mscorlib]System.Object::ToString()
  IL_0010:  call       void [mscorlib]System.Console::WriteLine(
                      string, object)
  IL_0015:  nop
  IL_0016:  ret
 } // end of method HelloCLR::Main

 .method public hidebysig specialname rtspecialname 
     instance void  .ctor() cil managed
 {
  // Code size       7 (0x7)
  .maxstack  8
  IL_0000:  ldarg.0
  IL_0001:  call       instance void [mscorlib]System.Object::.ctor()
  IL_0006:  ret
 } // end of method HelloCLR::.ctor

} // end of class HelloCLR

// =============================================================
// *********** DISASSEMBLY COMPLETE ***********************
// WARNING: Created Win32 resource file C:\herong\HelloCLR_dis.res