首页 > 解决方案 > 使用什么参数调用 coreclr_initialize?

问题描述

我在 C:\Program Files\dotnet\shared\Microsoft.NETCore.App\5.0.11\ 中找到的 coreclr.dll 中调用 coreclr_initialize

我不知道除了仅使用该硬编码路径中的最高版本之外,是否有官方方法可以找到最佳 coreclr.dll,但这似乎可行(如果它是 32 位进程,则使用 Program Files (x86))。

private static class Native
{
    [DllImport("coreclr.dll", CallingConvention=CallingConvention.Cdecl)]
    public static extern int coreclr_initialize(
        [MarshalAs(UnmanagedType.LPStr)] string exePath,
        [MarshalAs(UnmanagedType.LPStr)] string appDomainFriendlyName,
        int propertyCount,
        [MarshalAs(UnmanagedType.LPArray, ArraySubType=UnmanagedType.LPStr)] string[] propertyKeys,
        [MarshalAs(UnmanagedType.LPArray, ArraySubType=UnmanagedType.LPStr)] string[] propertyValues,
        out IntPtr hostHandle,
        out uint domainId);
}

示例代码将“TRUSTED_PLATFORM_ASSEMBLIES”显示为唯一的 propertyKey,并带有分号分隔的受信任程序集列表。但是我不知道在哪里可以找到是否可以传递其他有效参数。特别是,我不知道如何设置 AppDomain.CurrentDomain.BaseDirectory。它总是显示为空白,并且似乎不受我传递给 exePath 的影响。是否有其他可以设置的属性,以及应该设置的任何属性?

同样相关的是,我无法让 System.Data.SqlClient 自动加载 sni.dll,即使我调用 Kernel32.SetDllDirectory() 到 sni.dll 所在的目录。构建包喜欢把它放在“runtimes\win-x64\native”中。我不知道 DllImport 在 .NET 5 中查找本机 dll 的方式是否有所不同,所以如果我能正确获取 AppDomain 的 BaseDirectory,它会自动加载它吗?如果没有,我可以通过手动调用 LoadLibrary("sni.dll") 来解决它,但是由于各种原因,正确设置 BaseDirectory 似乎很重要。

我想这里确实有 2 个我认为相关的问题:可以设置哪些属性,以及如何设置 BaseDirectory?

标签: .net-core.net-5

解决方案


从 Hans Passant 分享的链接中:

const pal::char_t *PropertyNameMapping[] =
    {
        _X("TRUSTED_PLATFORM_ASSEMBLIES"),
        _X("NATIVE_DLL_SEARCH_DIRECTORIES"),
        _X("PLATFORM_RESOURCE_ROOTS"),
        _X("APP_CONTEXT_BASE_DIRECTORY"),
        _X("APP_CONTEXT_DEPS_FILES"),
        _X("FX_DEPS_FILE"),
        _X("PROBING_DIRECTORIES"),
        _X("STARTUP_HOOKS"),
        _X("APP_PATHS"),
        _X("RUNTIME_IDENTIFIER"),
        _X("BUNDLE_PROBE"),
        _X("HOSTPOLICY_EMBEDDED"),
        _X("PINVOKE_OVERRIDE")
    };

我已经通过实验验证了以下内容:

APP_CONTEXT_BASE_DIRECTORY 用于设置 AppDomain.CurrentDomain.BaseDirectory。NATIVE_DLL_SEARCH_DIRECTORIES 用于控制从何处加载 P/Invoke dll。


推荐阅读