gpt4 book ai didi

c# - 为什么 GetEntryAssembly 返回 null?

转载 作者:太空宇宙 更新时间:2023-11-03 19:50:21 24 4
gpt4 key购买 nike

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

MSDN 文档说:

The GetEntryAssembly method can return null when a managed assembly has been loaded from an unmanaged application. For example, if an unmanaged application creates an instance of a COM component written in C#, a call to the GetEntryAssembly method from the C# component returns null, because the entry point for the process was unmanaged code rather than a managed assembly.

我有以下设置:

Native executable (C++) -> Mixed mode assembly (C++/cli) -> Managed assembly (C#)

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

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

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

我们可以看到入口程序集应该是 native 可执行文件。但是它没有被检索到。请问这是什么原因呢?原生到托管的过渡不应该解决这个问题吗?

编辑

GetEntryAssembly 由 .NET 在内部使用。当它返回 null 时,我们只是遇到了副作用。可在托管程序集中用一行重现:

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

这将引发以下异常:System.IO.IsolatedStorage.IsolatedStorageException:无法确定域的身份。 此异常的根本原因似乎是入口程序集为空。

最佳答案

在我的例子中,GetEntryAssembly() 在被单元测试框架调用时返回了 null。对我来说,切换到 GetCallingAssembly() 就足够了。可能不会在所有情况下都有效,但对于某些情况会有效。

F# 示例:

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

关于c# - 为什么 GetEntryAssembly 返回 null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40217214/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com