我有一个可以编译并且可以正常工作的程序,并且使用了以下app.config
文件:
<?xml version="1.0"?>
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
</configuration>
编译程序时,它给了我两个文件myapp.exe
和myapp.exe.config
。如果缺少myapp.exe.config
,则在启动程序时,启动将失败,并且将引发异常
混合模式程序集是针对运行时的版本“ v1.1.4322”构建的,如果没有其他配置信息,则无法在4.0运行时中加载。
是否可以将配置文件作为资源包含在应用程序中,所以我只有myapp.exe
作为输出?
答案 0 :(得分:1)
您可以设置useLegacyV2RuntimeActivationPolicy at runtime,以下代码直接从该链接获取。该帮助程序类
public static class RuntimePolicyHelper
{
public static bool LegacyV2RuntimeEnabledSuccessfully { get; private set; }
static RuntimePolicyHelper()
{
ICLRRuntimeInfo clrRuntimeInfo =
(ICLRRuntimeInfo)RuntimeEnvironment.GetRuntimeInterfaceAsObject(
Guid.Empty,
typeof(ICLRRuntimeInfo).GUID);
try
{
clrRuntimeInfo.BindAsLegacyV2Runtime();
LegacyV2RuntimeEnabledSuccessfully = true;
}
catch (COMException)
{
// This occurs with an HRESULT meaning
// "A different runtime was already bound to the legacy CLR version 2 activation policy."
LegacyV2RuntimeEnabledSuccessfully = false;
}
}
[ComImport]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("BD39D1D2-BA2F-486A-89B0-B4B0CB466891")]
private interface ICLRRuntimeInfo
{
void xGetVersionString();
void xGetRuntimeDirectory();
void xIsLoaded();
void xIsLoadable();
void xLoadErrorString();
void xLoadLibrary();
void xGetProcAddress();
void xGetInterface();
void xSetDefaultStartupFlags();
void xGetDefaultStartupFlags();
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
void BindAsLegacyV2Runtime();
}
}
将在运行时自动设置,您可以验证RuntimePolicyHelper.LegacyV2RuntimeEnabledSuccessfully是否为true,否则将处理错误。