用什么参数调用 coreclr_initialize?
What parameters to call coreclr_initialize with?
我在 C:\Program Files\dotnet\shared\Microsoft.NETCore.App.0.11\
中的 coreclr.dll 中调用 coreclr_initialize
我不知道除了在该硬编码路径中使用最高版本之外是否有找到最佳 coreclr.dll 的官方方法,但这似乎可行(如果它是,则使用 Program Files (x86)一个 32 位进程)。
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?
来自 link 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。
我在 C:\Program Files\dotnet\shared\Microsoft.NETCore.App.0.11\
中的 coreclr.dll 中调用 coreclr_initialize我不知道除了在该硬编码路径中使用最高版本之外是否有找到最佳 coreclr.dll 的官方方法,但这似乎可行(如果它是,则使用 Program Files (x86)一个 32 位进程)。
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?
来自 link 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。