C#获取调用程序集的父程序集名称

Sar*_*edi 32 .net c# reflection system.reflection

我有一个我正在研究的C#单元测试应用程序.涉及三个程序集 - C#app本身的程序集,应用程序使用的第二个程序集,以及第二个程序集使用的第三个程序集.

所以这些电话是这样的:

First Assembly ------> Second Assembly---------> Third Assembly.
Run Code Online (Sandbox Code Playgroud)

我在第三个程序集中需要做的是获取调用第二个程序集的Fist Assembly的名称.

Assembly.GetExecutingAssembly().ManifestModule.Name
Assembly.GetCallingAssembly().ManifestModule.Name
Run Code Online (Sandbox Code Playgroud)

返回第二个程序集的名称.和

Assembly.GetEntryAssembly().ManifestModule.Name
Run Code Online (Sandbox Code Playgroud)

返回NULL

有没有人知道是否有办法获得第一届大会的集会名称?

按照其他用户的要求,我把代码放在这里.这不是100%的代码,而是遵循这样的代码.

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);
}
}
}
Run Code Online (Sandbox Code Playgroud)

和测试项目方法

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.");
        }
}
}
Run Code Online (Sandbox Code Playgroud)

AVe*_*Vee 31

我想你应该能够这样做:

using System.Diagnostics;
using System.Linq;

...

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

这将使您获得包含首先在当前线程中启动的第一个方法的程序集.因此,如果您不在主线程中,这可能与EntryAssembly不同,如果我理解您的情况,那么这应该是您正在寻找的程序集.

你也可以得到实际的Assembly而不是这样的名字:

Assembly initialAssembly = (from f in frames 
                          select f.GetMethod().ReflectedType.Assembly
                         ).Distinct().Last();
Run Code Online (Sandbox Code Playgroud)

编辑 - 截至2015年9月23日

请注意

GetMethod().ReflectedType
Run Code Online (Sandbox Code Playgroud)

可以为null,因此检索其AssemblyQualifiedName可能会引发异常.例如,如果想要检查仅专用于ORM(如linq2db等等)POCO类的vanilla c.tor,那就很有趣.

  • 如果你跟着`.Last()`,你为什么需要`.Distinct()`? (2认同)

rea*_*gos 11

这将返回引用currentAsembly的初始Assembly.

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();
Run Code Online (Sandbox Code Playgroud)


tym*_*tam 6

如果你也从nunit-console运行测试,Assembly.GetEntryAssembly()为null .

如果您只想要执行应用程序的名称,请使用:

 System.Diagnostics.Process.GetCurrentProcess().ProcessName 
Run Code Online (Sandbox Code Playgroud)

要么

 Environment.GetCommandLineArgs()[0];
Run Code Online (Sandbox Code Playgroud)

对于nunit-console,您将分别获得"nunit-console"和"C:\ Program Files\NUnit 2.5.10\bin \net-2.0 \nunit-console.exe".


Mar*_*llo 5

它对我有用:

System.Reflection.Assembly.GetEntryAssembly().GetName()
Run Code Online (Sandbox Code Playgroud)


Bot*_*000 -1

怎么样Assembly.GetEntryAssembly()?它返回进程的主要可执行文件。

Process.GetCurrentProcess().MainModule.ModuleName还应该返回与 ManifestModule 名称(“yourapp.exe”)大致相同的内容。