C# 将supportedRuntime嵌入exe文件

C# 将supportedRuntime嵌入exe文件,c#,c++,C#,C++,我需要将仅包含supportedRuntime设置的app.config文件嵌入到我的exe文件中。我尝试了构建操作嵌入式资源,但是它现在没有从配置文件中读取值,因此无法工作。这是我的配置文件: <?xml version="1.0" encoding="utf-8" ?> <configuration> <startup> <supportedRuntime version="v2.0.50727"/> <s

我需要将仅包含supportedRuntime设置的app.config文件嵌入到我的exe文件中。我尝试了构建操作嵌入式资源,但是它现在没有从配置文件中读取值,因此无法工作。这是我的配置文件:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup>
      <supportedRuntime version="v2.0.50727"/>
      <supportedRuntime version="v4.0"/>
    </startup>
</configuration>

因此,我们的想法是在.NET4.0上运行我的.NET2.0exe。有什么想法吗


谢谢。

这是不可能的。如果您绝对必须具有不带配置文件的可执行文件,那么最接近的方法就是编写非托管加载程序来为您运行CLR

假设您有c#应用程序,如:

using System;

namespace DumpVersion
{
    class Program
    {
        static int EntryPoint(string argument)
        {
            Console.Out.WriteLine(argument);
            Console.Out.WriteLine(Environment.Version);
            Console.In.ReadLine();
            return 0;
        }

        static void Main()
        {
            EntryPoint("Main");
        }
    }
}
您可以创建非托管()加载程序,如:

#include <metahost.h>

#pragma comment(lib, "mscoree.lib")

#import "mscorlib.tlb" raw_interfaces_only \
    high_property_prefixes("_get","_put","_putref") \
    rename("ReportEvent", "InteropServices_ReportEvent")

int wmain(int argc, wchar_t* argv[])
{
    HRESULT hr;
    ICLRMetaHost *pMetaHost = NULL;
    ICLRRuntimeInfo *pRuntimeInfo = NULL;
    ICLRRuntimeHost *pClrRuntimeHost = NULL;

    // build runtime
    // todo: add checks for invalid hr 
    hr = CLRCreateInstance(CLSID_CLRMetaHost, IID_PPV_ARGS(&pMetaHost));
    hr = pMetaHost->GetRuntime(L"v4.0.30319", IID_PPV_ARGS(&pRuntimeInfo));
    if (hr != S_OK) {
        hr = pMetaHost->GetRuntime(L"v2.0.50727", IID_PPV_ARGS(&pRuntimeInfo));
    }
    hr = pRuntimeInfo->GetInterface(CLSID_CLRRuntimeHost,
        IID_PPV_ARGS(&pClrRuntimeHost));

    // start runtime
    hr = pClrRuntimeHost->Start();

    // execute managed assembly
    DWORD pReturnValue;
    hr = pClrRuntimeHost->ExecuteInDefaultAppDomain(
        L"c:\\temp\\TestLoading\\DumpVersion\\bin\\Debug\\DumpVersion.exe",
        L"DumpVersion.Program",
        L"EntryPoint",
        L"hello .net runtime",
        &pReturnValue);

    // free resources
    pMetaHost->Release();
    pRuntimeInfo->Release();
    pClrRuntimeHost->Release();

    return 0;
}
#包括
#pragma注释(lib,“mscoree.lib”)
#仅导入“mscorlib.tlb”原始接口\
高级属性前缀(“\u get”、“\u put”、“\u putref”)\
重命名(“ReportEvent”、“InteropServices_ReportEvent”)
int wmain(int argc,wchar_t*argv[])
{
HRESULT-hr;
ICLRMetaHost*pMetaHost=NULL;
ICLRRuntimeInfo*pRuntimeInfo=NULL;
ICLRRuntimeHost*pClrRuntimeHost=NULL;
//构建运行时
//todo:添加无效人力资源的检查
hr=CLRCreateInstance(CLSID_CLRMetaHost,IID_PPV_ARGS(&pMetaHost));
hr=pMetaHost->GetRuntime(L“v4.0.30319”,IID_PPV_参数(&pRuntimeInfo));
如果(hr!=S_正常){
hr=pMetaHost->GetRuntime(L“v2.0.50727”,IID_PPV_参数(&pRuntimeInfo));
}
hr=pRuntimeInfo->GetInterface(CLSID\u CLRRuntimeHost,
IID_PPV_参数(&pClrRuntimeHost));
//启动运行时
hr=pClrRuntimeHost->Start();
//执行托管程序集
德沃德值;
hr=pClrRuntimeHost->ExecuteInDefaultAppDomain(
L“c:\\temp\\testload\\DumpVersion\\bin\\Debug\\DumpVersion.exe”,
L“DumpVersion.Program”,
L“入口点”,
L“hello.net运行时”,
&预燃值);
//免费资源
pMetaHost->Release();
pRuntimeInfo->Release();
pClrRuntimeHost->Release();
返回0;
}

更多信息:

.net向后兼容。如果机器安装了4.0,它将运行使用2.0编译的应用程序。你不需要两个标签。谢谢安德鲁,但不幸的是这不是真的。我们开始吧;试试这个:谢谢Andrew,这是完全正确的,但是正如我提到的,我正在试图找到一种不用配置文件的方法,或者将配置文件嵌入到exe中。