2012-06-13 12 views
22

Mam aplikację testową C# jednostki, nad którą pracuję. W grę wchodzą trzy zespoły - sam zespół aplikacji C#, drugi zestaw, z którego korzysta aplikacja, oraz trzeci zestaw, który jest używany przez drugi.C# Instalacja rodzica Nazwa zespołu dzwoniącego

Więc rozmowy iść tak:

First Assembly ------> Second Assembly---------> Third Assembly. 

Co muszę zrobić w trzecim zespole jest uzyskać nazwę Zgromadzenia Fist że zwanego drugiego zespołu.

Assembly.GetExecutingAssembly().ManifestModule.Name 
Assembly.GetCallingAssembly().ManifestModule.Name 

zwraca nazwę drugiego zestawu. i

Assembly.GetEntryAssembly().ManifestModule.Name 

return NULL

Czy ktoś wie, czy istnieje sposób, aby dostać się do nazwy zespołu pierwszego zespołu?

Zgodnie z wymaganiami innych użytkowników, umieszczam kod. To nie jest 100% kodu, ale postępuj zgodnie z tego kodu.

namespace FirstAssembly{ 
public static xcass A 
{ 
     public static Stream OpenResource(string name) 
     { 
      return Reader.OpenResource(Assembly.GetCallingAssembly(), ".Resources." + name); 
     } 
} 
} 

using FirstAssembly; 
namespace SecondAssembly{ 
public static class B 

{ 
public static Stream FileNameFromType(string Name) 

{ 
return = A.OpenResource(string name); 
} 
} 
} 

i projekt Metoda testu

using SecondAssembly; 
namespace ThirdAssembly{ 
public class TestC 
{ 

[TestMethod()] 
     public void StremSizTest() 
     { 
      // ARRANGE 
      var Stream = B.FileNameFromType("ValidMetaData.xml"); 
      // ASSERT 
      Assert.IsNotNull(Stream , "The Stream object should not be null."); 
     } 
} 
} 
+0

Czy któreś z tych pytań była pomocna? –

+0

@ChrisGessler: Brak odpowiedzi jest pomocny, ponieważ wszystkie sugerują użycie Assembly.GetEntryAssembly() i zwracają tutaj NULL. –

+0

Wszystkie oprócz mojego, które używa StackFrames –

Odpowiedz

0

Jak o Assembly.GetEntryAssembly()? Zwraca główny plik wykonywalny procesu.

Process.GetCurrentProcess().MainModule.ModuleName powinien również zwracać mniej więcej tyle samo, co nazwa ManifestModule ("yourapp.exe").

+0

to zwróci null –

+0

Ach, nazwa manifestmodule zwraca null, jak o. Assembly.GetEntryAssembly() pełna nazwa (lub getName() w zależności od potrzeb) –

+0

@sarooptrivedi dodałem inną opcję. – Botz3000

0

Spróbuj:

Assembly.GetEntryAssembly().ManifestModule.Name 

ten powinien być zespół, który został faktycznie zrealizowany, aby rozpocząć proces.

+1

Powraca NULL –

4

Jeśli trzeba znaleźć górny montaż, niezależnie od kolejności wywołania, można użyć

Assembly.GetEntryAssembly() 
+3

Powraca NULL –

0

nie całkowicie pewien, co szukasz, zwłaszcza podczas pracy w ramach jednostki przetestować będziesz skończyć z:

mscorlib.dll 
Microsoft.VisualStudio.TestPlatform.Extensions.VSTestIntegration.dll 

(lub coś podobnego w zależności od badanego biegacza) w zbiorze zespołów, które prowadzą do jakiejkolwiek metody miano.

Poniższy kod wyświetla nazwy każdego z zestawów biorących udział w połączeniu.

var trace = new StackTrace(); 
var assemblies = new List<Assembly>(); 
var frames = trace.GetFrames(); 

if(frames == null) 
{ 
    throw new Exception("Couldn't get the stack trace"); 
} 

foreach(var frame in frames) 
{ 
    var method = frame.GetMethod(); 
    var declaringType = method.DeclaringType; 

    if(declaringType == null) 
    { 
     continue; 
    } 

    var assembly = declaringType.Assembly; 
    var lastAssembly = assemblies.LastOrDefault(); 

    if(assembly != lastAssembly) 
    { 
     assemblies.Add(assembly); 
    } 
} 

foreach(var assembly in assemblies) 
{ 
    Debug.WriteLine(assembly.ManifestModule.Name); 
} 
+0

Znam wszystkie zasady testu jednostkowego. Teraz chodzi mi o to, że nie chcę czytać całego zgromadzenia. Po prostu chcę odniesienia A w C. To sprawia, że ​​mój kod jest złożony. –

24

Chyba powinieneś być w stanie zrobić to tak:

using System.Diagnostics; 
using System.Linq; 

... 

StackFrame[] frames = new StackTrace().GetFrames(); 
string initialAssembly = (from f in frames 
          select f.GetMethod().ReflectedType.AssemblyQualifiedName 
         ).Distinct().Last(); 

To będzie Ci zespołu, który zawiera pierwszą metodę, która rozpoczęła się pierwsza rozpoczęła się w bieżącym wątku. Więc jeśli nie jesteś w głównym wątku, może to być coś innego niż EntryAssembly, jeśli dobrze zrozumiem twoją sytuację, powinien to być Twój zespół, którego szukasz.

Można również uzyskać rzeczywistą Assembly zamiast nazwy jak ta:

Assembly initialAssembly = (from f in frames 
          select f.GetMethod().ReflectedType.Assembly 
         ).Distinct().Last(); 

Edycja - od Wrz 23, 2015

Proszę zauważyć, że

GetMethod().ReflectedType 

puszka ma wartość null, więc pobranie jej AssemblyQualifiedName może rzucić wyjątek. Na przykład, jest to interesujące, jeśli chcesz sprawdzić wanilię c.tor poświęconą tylko ORM (jak linq2db, itd ...). Klasa POCO.

+0

To jest świetna odpowiedź! Naprawdę pomógł mi dostać się do tego, co było mi potrzebne – ppumkin

6

Assembly.GetEntryAssembly() jest null, jeśli uruchomić testy z nunit-konsoli też.

Jeśli chcesz tylko nazwę aplikacji wykonującego następnie użyć:

System.Diagnostics.Process.GetCurrentProcess().ProcessName 

lub

Environment.GetCommandLineArgs()[0]; 

Dla nunit-konsoli dostaniemy "NUnit-console" i „C: \ Program Files \ NUnit 2.5.10 \ bin \ net-2.0 \ nunit-console.exe ".

0

Jeśli znasz numer ramki w stosie, można użyć obiektu StackFrame i pominąć liczbę poprzedniej ramce.

// You skip 2 frames 
System.Diagnostics.StackFrame stack = new System.Diagnostics.StackFrame(2, false); 
string assemblyName = stack.GetMethod().DeclaringType.AssemblyQualifiedName; 

Ale jeśli chcesz pierwsze połączenie, musisz uzyskać wszystkie ramki i wziąć pierwszy. (Patrz rozwiązanie AVEE)

7

To spowoduje powrót do wstępnego montażu, który odwołuje swoje currentAssembly.

-1

Umożliwia to złożenie oryginalnego zestawu przy użyciu dwóch złożeń w teście NUnit, bez zwracania wartości NULL. Mam nadzieję że to pomoże.

var currentAssembly = Assembly.GetExecutingAssembly(); 
var callerAssemblies = new StackTrace().GetFrames() 
     .Select(x => x.GetMethod().ReflectedType.Assembly).Distinct() 
     .Where(x => x.GetReferencedAssemblies().Any(y => y.FullName ==  currentAssembly.FullName)); 
var initialAssembly = callerAssemblies.Last(); 
+0

Zamieszczanie odpowiedzi tylko na kod jest źle zrozumiane, ponieważ nie pomaga OP zrozumieć ich problemu lub rozwiązania. – leigero

+0

18 miesięcy później publikujesz odpowiedź tak samo, jak ta nad twoją? – dinotom

2

pracował dla mnie za pomocą tego:

System.Reflection.Assembly.GetEntryAssembly().GetName()