从资源加载dll失败

我的应用程序依赖于几个DLL。 我把它们全部放在资源中,而不是在应用程序的开始,我使用我在网上找到的方法加载它们:

public static void LoadDllsFromResources()
        {
        AppDomain.CurrentDomain.AssemblyResolve += (sender, a) =>
        {
            string dllName = a.Name.Contains(',')
                                ? a.Name.Substring(0, a.Name.IndexOf(','))
                                : a.Name.Replace(".dll", "");

            dllName = dllName.Replace(".", "_");

            if (dllName.EndsWith("_resources")) return null;

            System.Resources.ResourceManager rm =
                new System.Resources.ResourceManager(
                    "DesktopDashboard" + ".Properties.Resources",
                    System.Reflection.Assembly.GetExecutingAssembly());

            byte[] bytes = (byte[])rm.GetObject(dllName);

            return System.Reflection.Assembly.Load(bytes);
        };
    }

它工作正常,直到我试图添加WPFToolkitExtended.dll。 比我的应用程序抛出一个错误。 是什么让这个DLL如此特别?

System.Windows.Markup.XamlParseException:'Set connectionId throw a exception。' 行号“4”和行位置“37”。 ---> System.InvalidCastException:[A] Xceed.Wpf.Toolkit.BusyIndi​​cator不能转换为[B] Xceed.Wpf.Toolkit.BusyIndi​​cator。 类型A来源于字节数组中的上下文“LoadNeither”中的'WPFToolkit.Extended,版本= 1.7.4644.13122,Culture = neutral,PublicKeyToken = 3e4669d2f30244f4'。 类型B源自'WPFFoolkit.Extended,版本= 1.7.4644.13122,Culture = neutral,PublicKeyToken = 3e4669d2f30244f4'在上下文'LoadNeither'中的字节数组中。 在MS.Internal.Xaml.Runtime.ClrObjectRuntime.SetConnectionId(对象根,Int32连接Id,对象实例)的DesktopDashboard.LogoutWindow.System.Windows.Markup.IComponentConnector.Connect(Int32 connectionId,Object target)---内部异常结束堆栈跟踪---在System.Windows.Markup.XamlReader.RewrapException(Exception e,IXamlLineInfo lineInfo,Uri baseUri)在System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader,IXamlObjectWriterFactory writerFactory,Boolean skipJournaledProperties,Object rootObject,XamlObjectWriterSettings设置,Uri baseUri)at System.Windows.Markup.WpfXamlLoader.LoadBaml(XamlReader xamlReader,Boolean skipJournaledProperties,Object rootObject,XamlAccessLevel accessLevel,Uri baseUri)at System.Windows.Markup.XamlReader.LoadBaml(Stream stream,ParserContext parserContext,Object parent,布尔closeStream)在System.Windows.Application.LoadComponent(对象组件,Uri resourceLocator)在DesktopDashboard.LogoutWindow.InitializeCom 在System.Windows.EventRoute.InvokeHandlersImpl上的System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target,RoutedEventArgs routedEventArgs)上的DesktopDashboard.MainWindow.ContextMenuItemLogout_Click(Object sender,RoutedEventArgs e)处的DesktopDashboard.LogoutWindow..ctor()上的ponent() (System.Windows.Controls.MenuItem.InvokeClickAfterRender(Object arg))上的System.Windows.UIElement.RaiseEvent(RoutedEventArgs e)处的System.Windows.UIElement.RaiseEventImpl(DependencyObject sender,RoutedEventArgs args)的源,RoutedEventArgs args,Boolean reRaised)
在System.Windows的MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source,Delegate method,Object args,Int32 numArgs,Delegate catchHandler)上的System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate回调,Object args,Int32 numArgs) System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup上System.Threading.ExecutionContext.runTryCode(对象userData)上System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(对象状态)的TryThread.DispatcherOperation.InvokeImpl()(TryCode code,CleanupCode backoutCode (System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback callback,Object state,Boolean ignoreSyncCtx)在System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext,ContextCallback callback,Object state)在System.Windows运行(ExecutionContext executionContext,ContextCallback回调,对象状态)。 在MS.Win32上的System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd,Int32 msg,IntPtr wParam,IntPtr lParam,Boolean&handling)处的System.Windows.Threading.Dispatcher.ProcessQueue()处的Threading.DispatcherOperation.Invoke() HwndWrapper.WndProc(IntPtr hwnd,Int32 msg,IntPtr wParam,IntPtr lParam,布尔&处理)在MS.Win32.HwndSubclass.DispatcherCallbackOperation(对象o)在System.Windows.Threading.ExceptionWrapper.InternalRealCall(委托回调,对象args,Int32 numArgs )在System.Windows.Threading.Dispatcher.InvokeImpl上的MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source,Delegate方法,Object args,Int32 numArgs,Delegate catchHandler)在派生类中的优先级,TimeSpan超时,Delegate方法,Object args, Int32 numArgs)at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd,Int32 msg,IntPtr wParam,IntPtr lParam)at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG&msg)at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame f rame)在System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame框架)
在System.Windows.Application.RunDispatcher(对象忽略)在System.Windows.Application.RunInternal(窗口窗口)在System.Windows.Application.Run(窗口窗口)在System.Windows.Application.Run()在DesktopDashboard.App .Main(String [] args)


您的代码不止一次加载相同的程序集。 当你使用Assembly.Load(byte [])时,这是一个问题,CLR无法帮助你发现程序集已经被加载。 技术术语是这样的程序集在没有“加载上下文”的情况下被加载。 接下来出现的问题是相同的类型不再兼容,类型标识不仅包含namspace名称和类型名称,还包含它来自的组件。

确保在请求相同装配时返回完全相同的装配参考是您的工作。 最好的办法是保留一个跟踪这些程序集的Dictionary<string, Assembly>


假设你在Visual Studio中,可以直接从IDE将它们添加到项目中。 看这里。

链接地址: http://www.djcxy.com/p/63603.html

上一篇: Loading dll from resources fails

下一篇: Virtual mouse click c#