0

我的应用程序依赖于几个 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:“设置 connectionId 引发异常。” 行号“4”和行位置“37”。---> System.InvalidCastException:[A]Xceed.Wpf.Toolkit.BusyIndi​​cator 不能转换为 [B]Xceed.Wpf.Toolkit.BusyIndi​​cator。类型 A 源自字节数组中上下文“LoadNeither”中的“WPFToolkit.Extended, Version=1.7.4644.13122, Culture=neutral, PublicKeyToken=3e4669d2f30244f4”。类型 B 源自字节数组中上下文“LoadNeither”中的“WPFToolkit.Extended, Version=1.7.4644.13122, Culture=neutral, PublicKeyToken=3e4669d2f30244f4”。在 DesktopDashboard.LogoutWindow.System.Windows.Markup.IComponentConnector.Connect(Int32 connectionId, Object target) 在 MS.Internal.Xaml.Runtime.ClrObjectRuntime.SetConnectionId(Object root,
在 System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) 在 MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler) 在 System.Windows .Threading.DispatcherOperation.InvokeImpl() 在 System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(Object state) 在 System.Threading.ExecutionContext.runTryCode(Object userData) 在 System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode 代码,CleanupCode backoutCode , 对象 userData) 在 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext,System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 在 System.Windows.Threading.DispatcherOperation.Invoke() 在 System.Windows.Threading.Dispatcher.ProcessQueue() 的 ContextCallback 回调,对象状态,布尔 ignoreSyncCtx) ) 在 System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& 处理) 在 MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& 处理) 在 MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o) 在 System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) 在 MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method,对象参数,Int32 numArgs, Delegate catchHandler) 在 System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority 优先级, TimeSpan 超时, 委托方法, Object args, Int32 numArgs) 在 MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam) 在 MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg) 在 System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame) 在 System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame 框架)处的 DispatchMessage(MSG 和消息) System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame 框架)System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame 框架)处的 DispatchMessage(MSG 和消息) System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame 框架)
在 System.Windows.Application.RunDispatcher(Object ignore) 在 System.Windows.Application.RunInternal(Window 窗口) 在 System.Windows.Application.Run(Window 窗口) 在 System.Windows.Application.Run() 在 DesktopDashboard.App .Main(字符串 [] 参数)

4

2 回答 2

3

您的代码不止一次加载同一个程序集。当您使用 Assembly.Load(byte[]) 时,这是一个问题,CLR 无法帮助您确定程序集是否已加载。技术术语是这样的程序集是在没有“加载上下文”的情况下加载的。接下来的问题是同一类型不再兼容,类型标识不仅包括命名空间名称和类型名称,还包括它来自的程序集。

您的工作是确保在请求相同的程序集时返回完全相同的程序集引用。最好的办法是Dictionary<string, Assembly>跟踪此类程序集。

于 2012-09-21T13:38:54.917 回答
0

假设您使用的是 Visual Studio,您可以直接从 IDE 将它们添加到项目中。看这里

于 2012-09-21T13:05:02.337 回答