为什么GetEntryAssembly返回null?

时间:2016-10-24 11:27:40

标签: c# .net c++-cli

C#中GetEntryAssembly的底层实现是什么?为什么它从非托管应用程序加载dll时返回null?

MSDN文档说:

  

从非托管应用程序加载托管程序集时,GetEntryAssembly方法可以返回null。例如,如果非托管应用程序创建用C#编写的COM组件的实例,则从C#组件调用GetEntryAssembly方法将返回null,因为该进程的入口点是非托管代码而不是托管程序集。

我有以下设置:

  

原生可执行文件(C ++) - >混合模式组装(C ++ / cli) - >管理   汇编(C#)

托管程序集是可选的,在混合模式程序集中,可以调用GetEntryAssembly并获取null。

在调试过程中,我们已在C#source code中跟踪此调用:

[DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode), SuppressUnmanagedCodeSecurity]
private static extern void GetEntryAssembly(ObjectHandleOnStack retAssembly);

我们可以看到条目程序集应该是本机可执行文件。但是它没有被检索。我想知道这是什么原因?管理转型不应该是原生的吗?

修改

GetEntryAssembly由.NET内部使用。我们只是在返回null时遇到副作用。 可以在Managed assembly中使用一行重现:

System.IO.IsolatedStorage.IsolatedStorageFile.GetUserStoreForDomain ();

这将引发以下异常:System.IO.IsolatedStorage.IsolatedStorageException: Unable to determine the identity of domain.此异常的根本原因似乎是条目程序集为null。

2 个答案:

答案 0 :(得分:1)

就我而言,GetEntryAssembly()在单元测试框架调用时返回了null。对我来说,切换到GetCallingAssembly()就足够了。可能不会在每种情况下都起作用,但在某些情况下会起作用。

一个F#示例:

let getEntryAssembly() =
    match Assembly.GetEntryAssembly() with
    | null -> Assembly.GetCallingAssembly()
    | entryAsm -> entryAsm

答案 1 :(得分:0)

程序集是.NET特定的类。正如您所提到的,您从非托管代码调用托管方法,GetEntryAssembly将返回null,因为没有理由返回任何内容!

程序集中的所有方法都绑定到.NET体系结构,并且没有可能的C ++,Java或任何其他外部编译源的实现。

如果你仍然没有得到它 - 试着想象使用这种'组件的反射:获得一些核心优化的c ++方法名称,或者获取变量类型。 。这只适用于C ++,更不用说其他语言了。