scriptcs 混合模式汇编错误
scriptcs Mixed mode assembly error
我在 scriptcs 中添加了一个应用程序,并添加了一些对版本为 v2.0.50727 的程序集的引用。因此,虽然 运行 scriptcs 将其归档 returns,因为混合模式程序集是针对运行时版本 'v2.0.50727' 构建的,无法加载到 4.0 runtime.Setting 属性中 useLegacyV2RuntimeActivationPolicy="true" 在 app.config 中可能会解决 asp.net 网络应用程序中的问题。但在脚本中它不起作用。进一步搜索发现上面的属性 useLegacyV2RuntimeActivationPolicy="true" 应该添加为 scriptcs.exe.config。我有一个名为 FMUpgrade.csx 的应用程序文件,我们如何在 FMUpgrade.csx file.scriptcs 文档中引用此 scriptcs.exe.config 关于 scriptcs.exe.config。还添加了 program.exe.config 与 app.config 但仍然没有成功。
经过大量研究,我找到了解决上述问题的方法。
通过使用 class ExeConfigurationFileMap 我们可以从 app.config 中获取键值,它无法绕过由混合模式汇编错误引起的支持的运行时错误。
服务器服务器=新服务器(新服务器连接(con)); server.ConnectionContext.ExecuteNonQuery(脚本);
该错误是在执行语句ExecuteNonQuery 时导致的。
所以在执行语句
之前
if(RuntimePolicyHelper.LegacyV2RuntimeEnabledSuccessfully)
server.ConnectionContext.ExecuteNonQuery(脚本);
解决方法如下
使用 System.Runtime.CompilerServices;
使用 System.Runtime.InteropServices;
public 静态 class RuntimePolicyHelper
{
public static bool LegacyV2RuntimeEnabledSuccessfully
{ 得到;私有集; }
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();
}
} using System.Runtime.CompilerServices;
使用System.Runtime.InteropServices;
public 静态 class RuntimePolicyHelper
{
public static bool LegacyV2RuntimeEnabledSuccessfully { get;私有集; }
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();
}
}
我在 scriptcs 中添加了一个应用程序,并添加了一些对版本为 v2.0.50727 的程序集的引用。因此,虽然 运行 scriptcs 将其归档 returns,因为混合模式程序集是针对运行时版本 'v2.0.50727' 构建的,无法加载到 4.0 runtime.Setting 属性中 useLegacyV2RuntimeActivationPolicy="true" 在 app.config 中可能会解决 asp.net 网络应用程序中的问题。但在脚本中它不起作用。进一步搜索发现上面的属性 useLegacyV2RuntimeActivationPolicy="true" 应该添加为 scriptcs.exe.config。我有一个名为 FMUpgrade.csx 的应用程序文件,我们如何在 FMUpgrade.csx file.scriptcs 文档中引用此 scriptcs.exe.config 关于 scriptcs.exe.config。还添加了 program.exe.config 与 app.config 但仍然没有成功。
经过大量研究,我找到了解决上述问题的方法。 通过使用 class ExeConfigurationFileMap 我们可以从 app.config 中获取键值,它无法绕过由混合模式汇编错误引起的支持的运行时错误。 服务器服务器=新服务器(新服务器连接(con)); server.ConnectionContext.ExecuteNonQuery(脚本); 该错误是在执行语句ExecuteNonQuery 时导致的。 所以在执行语句
之前if(RuntimePolicyHelper.LegacyV2RuntimeEnabledSuccessfully) server.ConnectionContext.ExecuteNonQuery(脚本);
解决方法如下 使用 System.Runtime.CompilerServices; 使用 System.Runtime.InteropServices; public 静态 class RuntimePolicyHelper { public static bool LegacyV2RuntimeEnabledSuccessfully { 得到;私有集; }
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();
}
} using System.Runtime.CompilerServices;
使用System.Runtime.InteropServices; public 静态 class RuntimePolicyHelper { public static bool LegacyV2RuntimeEnabledSuccessfully { get;私有集; }
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();
}
}