Visual Studio:如何在exe中嵌入app.config?

时间:2020-05-12 22:17:23

标签: c# .net visual-studio

我有一个可以编译并且可以正常工作的程序,并且使用了以下app.config文件:

<?xml version="1.0"?>
<configuration>
    <startup useLegacyV2RuntimeActivationPolicy="true">
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
    </startup>
</configuration>

编译程序时,它给了我两个文件myapp.exemyapp.exe.config。如果缺少myapp.exe.config,则在启动程序时,启动将失败,并且将引发异常

混合模式程序集是针对运行时的版本“ v1.1.4322”构建的,如果没有其他配置信息,则无法在4.0运行时中加载。

是否可以将配置文件作为资源包含在应用程序中,所以我只有myapp.exe作为输出?

1 个答案:

答案 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,否则将处理错误。