2009-09-10 10 views
6

C# .net (2.0) 'da bir sistem yazıyorum. Takılabilir bir modül türü mimariye sahiptir. Temel modülleri yeniden inşa etmeden sisteme montajlar eklenebilir. Yeni modülle bağlantı kurmak için, başka bir modülde isimle bir statik yöntem çağırmayı denemek istiyorum. Aranan modülün yapım aşamasında herhangi bir şekilde referans gösterilmesini istemiyorum.C# çalışma zamanı referansı olmadan çalışma zamanında statik bir yöntem mi çağırıyorsunuz?

Yönetilmeyen kod yazarken, .dll dosyasından yola çıkarken, .dll dosyasını belleğe almak için LoadLibrary() kullanırdım, sonra GetProcAddress() işlevini kullanarak, aramak istediğim işleve bir işaretçi yollayın. Aynı sonucu C#/.NET'de nasıl elde ederim. Montaj Assembly.LoadFrom (...) kullanılarak yüklendikten sonra

cevap

16

isme göre tipini almak ve statik bir yöntem alabilirsiniz: Burada

Type t = Type.GetType(className); 

// get the method 
MethodInfo method = t.GetMethod("MyStaticMethod",BindingFlags.Public|BindingFlags.Static); 

Then you call the method: 

method.Invoke(null,null); // assuming it doesn't take parameters 
+2

+ 1, Ayrıca 'className' bir örnek yöntemini çağırmak için "MyNamespace.Class1" – icl7126

1

örneği verilmiştir:

 string assmSpec = ""; // OS PathName to assembly name... 
     if (!File.Exists(assmSpec)) 
      throw new DataImportException(string.Format(
       "Assembly [{0}] cannot be located.", assmSpec)); 
     // ------------------------------------------- 
     Assembly dA; 
     try { dA = Assembly.LoadFrom(assmSpec); } 
     catch(FileNotFoundException nfX) 
     { throw new DataImportException(string.Format(
      "Assembly [{0}] cannot be located.", assmSpec), 
      nfX); } 
     // ------------------------------------------- 
     // Now here you have to instantiate the class 
     // in the assembly by a string classname 
     IImportData iImp = (IImportData)dA.CreateInstance 
          ([Some string value for class Name]); 
     if (iImp == null) 
      throw new DataImportException(
       string.Format("Unable to instantiate {0} from {1}", 
        dataImporter.ClassName, dataImporter.AssemblyName)); 
     // ------------------------------------------- 
     iImp.Process(); // Here you call method on interface that the class implements 
+0

Kodu gibi ad alanı içermesi gerektiğinden bahsetmeye değer. Statik yöntem istedim. Ama sonunda bu parçaya ihtiyacım olacak. Teşekkürler. +1 –