2015-04-04 67 views
-2

我的所有項目都設置爲使用.net 4.5.1 測試項目使用一些針對.NET v2.0.50727的SQl服務器程序集。無法加載混合模式程序集

的App.config:

<startup useLegacyV2RuntimeActivationPolicy="true"> 
     <supportedRuntime version="v2.0.50727"/> 
     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1"/> 
</startup> 

我還檢查等這個線程: Mixed mode assembly

+1

對於所有誰downvoted,更好地提供解決方案,而不是downvoting的! 或者按照建議留下意見,當你downvote! – Legends 2015-04-04 12:18:59

+0

(*我不是downvoter。*)可能是app.config被複制到構建輸出文件夾中(並且說你的啓動程序集是'ass.exe'),它顯示爲'ass.exe.config'。 – 2015-04-04 15:52:49

+0

它設置爲「不要複製」,只有exe.config位於bin中,並按照上述配置.... hm。 發生錯誤的項目是一個c#測試項目。 當來自Microsoft.SqlServer * .dll的api代碼被訪問時發生。 Theay在.NET v2.0.50727上編譯。 – Legends 2015-04-04 16:38:32

回答

0

由於起動體對我沒有做到,我用下面的辦法跟着去了:

Detailed explanation

使用以下輔助類:

using System; 
    using System.Runtime.CompilerServices; 
    using System.Runtime.InteropServices; 

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

你撥打SMO的東西之前,就檢查一切正常

if (!RuntimePolicyHelper.LegacyV2RuntimeEnabledSuccessfully) 
       throw new Exception("Could not load SMO");