首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么GetEntryAssembly返回null?

为什么GetEntryAssembly返回null?
EN

Stack Overflow用户
提问于 2016-10-24 11:27:39
回答 2查看 9.2K关注 0票数 8

GetEntryAssembly在C#中的基本实现是什么?以及为什么在从非托管应用程序加载dll时返回null?

MSDN文档说:

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

我有以下设置:

本机可执行(C++) ->混合模式程序集(C++/cli) ->托管程序集(C#)

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

在调试过程中,我们跟踪到了C# 源代码中的这个调用

代码语言:javascript
运行
复制
[DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode), SuppressUnmanagedCodeSecurity]
private static extern void GetEntryAssembly(ObjectHandleOnStack retAssembly);

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

编辑

GetEntryAssembly是由.NET内部使用的,当它返回null时,我们只是在体验副作用。可复制的管理组装中的一条线:

代码语言:javascript
运行
复制
System.IO.IsolatedStorage.IsolatedStorageFile.GetUserStoreForDomain ();

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-24 11:35:22

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

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

如果你还不明白--试着想象一下,在这种“汇编”中使用反射:获得一些硬核优化的c++名称的方法,或者获取variables...and的类型--这只适用于C++,更不用说其他语言了。

票数 4
EN

Stack Overflow用户

发布于 2018-11-09 15:09:26

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

一个F#示例:

代码语言:javascript
运行
复制
let getEntryAssembly() =
    match Assembly.GetEntryAssembly() with
    | null -> Assembly.GetCallingAssembly()
    | entryAsm -> entryAsm
票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40217214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档