am shammout
am shammout

Reputation: 195

Configuring .net installer project

I am using .net4 installer project to install my application which is written in .net 4 now the problem is that i am using tow assembly from .net2 in my installer so when i run the installer it fails with this message "Mixed mode assembly is built against version 'v2.0.50727' of the run-time and cannot be loaded in the 4.0 run-time without additional configuration information." now the problem can solved with this lines in app.config

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

the problem is i could not do this in installer class what can i do ?

Upvotes: 0

Views: 183

Answers (1)

am shammout
am shammout

Reputation: 195

finally after a deep search i found the solution it is to user useLegacyV2RuntimeActivationPolicy by code

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();
    }
}

then i use it in my code like this

   if (RuntimePolicyHelper.LegacyV2RuntimeEnabledSuccessfully)
   {
     //my mixed mode dell call goes here
   }

Upvotes: 1

Related Questions