在尝试加载程序集 ID 65537 时 Microsoft .NET Framework 出错.服务器可能资源不

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在尝试加载程序集 ID 65537 时 Microsoft .NET Framework 出错.服务器可能资源不相关的知识,希望对你有一定的参考价值。

在尝试加载程序集 ID 65537 时 Microsoft .NET Framework 出错。服务器可能资源不足,或者不信任该程序集,因为它的 PERMISSION_SET 设置为 EXTERNAL_ACCESS 或 UNSAFE。请重新运行查询,或检查有关的文档了解如何解决程序集信任问题。有关此错误的详细信息:
System.IO.FileLoadException: 未能加载文件或程序集“grqsh.moebius.core7, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null”或它的某一个依赖项。发生与安全有关的错误。 (异常来自 HRESULT:0x8013150A)
System.IO.FileLoadException:
在 System.Reflection.Assembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection)
在 System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)
在 System.Reflection.Assembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)
在 System.Reflection.Assembly.Load(String assemblyString)
这个是怎么回事呀,在这执行存储过程中出现的!

产生的原因大概是,在备份数据库的时候,在机器A,那么数据库的拥有者是A\Administrator(如果用windows登录创建),那么但是我们还原到服务器B,那么拥有者可能是B\Administrator,那么SQL CLR的安全性会认为该程序集不可靠.

解决方案:
在还原数据库之后,我们可以将数据库的OWNER设置成SA.
exec sp_changedbowner 'sa'
再调用存储过程就是成功的.
可以查看:KB http://support.microsoft.com/kb/918040
后来经过一些整理,发现当SQL CLR 存在EXTERNAL_ACCESS或者是UNSAFE的程序集的时候,SQL Server会检查DBO的SID在sys.databases 和sys.server_principals是否一致.

因此我们可能未必一定要修改成sa 的,只要所有者的SID在sys.databases和sys.server_principals 是一致的,就不出问题.

我们在SSMS里面右键数据库属性->找到文件选项卡->发现在所有者(是空的,还原以后原来的SID,数据库所有者在当前的sys.server_principals不匹配的),我们可以在 [...] 里面选择一个,具有创建CREATE ASSEMLY 权限的所有者就好,我选择了B\Administrator,然后测试 CLR 存储过程,没问题,
引深:

在SQL Server 复制里面也存在类似的问题,就是我们做 "对等复制" 的时候,会出现DBO不存在,以及sp_replcmd 不存在类似的错误.其实也是因为对等复制初始化订阅是通过 RESTORE 来实现的,因此只要简单的修改数据库所有者 就好了....那么对等复制的问题也就解决了!!
参考技术A use master--这个必需在此数据库
GRANT UNSAFE ASSEMBLY TO [用户];
GRANT EXTERNAL ACCESS ASSEMBLY TO [用户];
ALTER DATABASE [数据库] SET TRUSTWORTHY ON; --可信
=========
做完这三个动作,就搞定了。但,我还没有研究出来,为什么,请高手跟贴。

Caliburn.Micro 无法匹配来自不同程序集的 View 和 ViewModel

【中文标题】Caliburn.Micro 无法匹配来自不同程序集的 View 和 ViewModel【英文标题】:Caliburn.Micro can't match View and ViewModel from different assemblies 【发布时间】:2013-07-02 15:11:21 【问题描述】:

我刚开始使用 Caliburn.Micro。

我正在尝试引导我的简单示例解决方案,将 ShellView(用户控件)放置在 Test.App 程序集中,将 ShellViewModel 放置在 Test.ViewModel 程序集中。

我得到的是一个带有以下文本的窗口:“找不到 Caliburn.Test.ViewModel.ShellViewModel 的视图”。

但如果我将 ViewModel 移动到 .App 程序集,它会完美运行。

这是 Caliburn.Micro.Test 程序集中的引导程序(可执行文件):

namespace Caliburn.Micro.Test

    public class AppBootstrapper : BootstrapperBase
    
        SimpleContainer container;

        public AppBootstrapper()
        
            this.Start();
        

        protected override void Configure()
        
            container = new SimpleContainer();

            this.container.Singleton<IWindowManager, WindowManager>();
            this.container.Singleton<IEventAggregator, EventAggregator>();
            this.container.PerRequest<IShell, ShellViewModel>();
        

        protected override object GetInstance(Type service, string key)
        
            var instance = this.container.GetInstance(service, key);
            if (instance != null)
                return instance;

            throw new InvalidOperationException("Could not locate any instances.");
        

        protected override IEnumerable<object> GetAllInstances(Type service)
        
            return this.container.GetAllInstances(service);
        

        protected override void BuildUp(object instance)
        
            this.container.BuildUp(instance);
        

        protected override void OnStartup(object sender, System.Windows.StartupEventArgs e)
        
            this.DisplayRootViewFor<IShell>();
        

        protected override IEnumerable<System.Reflection.Assembly> SelectAssemblies()
        

            var assemblies = new List<Assembly>()
            
                Assembly.GetExecutingAssembly(),
                Assembly.Load("Caliburn.Micro.Test.ViewModel"),
            ;

            return assemblies;
        
    

这是我在 Caliburn.Micro.Test.ViewModel 程序集(类库)中的 ViewModel:

namespace Caliburn.Micro.Test.ViewModel

    public interface IShell
    
    

    public class ShellViewModel : IShell
    
    

你能帮我解决我的问题吗? 谢谢! :D

【问题讨论】:

您是否覆盖了SelectAssemblies?您需要向 CM 提供所有包含视图的程序集 【参考方案1】:

感谢这篇文章解决了 http://www.jerriepelser.com/blog/split-views-and-viewmodels-in-caliburn-micro/

编辑:由于您将您的回复与我的整合在一起,我将接受的答案更改为您的。

【讨论】:

链接已失效。域名已过期。 :( 我修复了链接,见jerriepelser.com/blog/the-killing-of-a-rockstar【参考方案2】:

通过在引导程序中覆盖 SelectAssemblies,检查您是否为 CM 选择了程序集。

这里的文档有一个例子:

http://caliburnmicro.codeplex.com/wikipage?title=Customizing%20The%20Bootstrapper

protected override IEnumerable<Assembly> SelectAssemblies()

    return new[] 
        Assembly.GetExecutingAssembly()
    ;

编辑:

好的,您不仅需要选择程序集来告诉 CM 去哪里查找 - 在您的情况下,您的虚拟机和视图可能位于不同的命名空间中,因为它们位于不同的库中。您可以在两个库中使用相同的根命名空间,并且标准视图解析应该可以正常工作 - 但是,您需要确保在引导程序中选择了程序集,以便告诉 CM 尝试解析视图的程序集。

如果您出于某种原因想要将视图/VM 放在不同的命名空间中,则需要自定义 CM 用于解析视图的逻辑。它使用命名约定根据视图模型的完全限定类型名称来定位视图(反之亦然,如果您使用的是视图优先方法)

我建议阅读介绍性文档:

http://caliburnmicro.codeplex.com/wikipage?title=Basic%20Configuration%2c%20Actions%20and%20Conventions&referringTitle=Documentation

然后按照它进行。如果您想直接跳到命名约定,请查看此特定页面:

http://caliburnmicro.codeplex.com/wikipage?title=View%2fViewModel%20Naming%20Conventions&referringTitle=Documentation

http://caliburnmicro.codeplex.com/wikipage?title=Handling%20Custom%20Conventions&referringTitle=Documentation

【讨论】:

你对“CM”有什么看法?无论如何,我读到这是为必须搜索视图的程序集完成的,但视图在引导程序的同一个程序集中,视图模型在另一个程序集中。 Anyqay,你能展示一个导入的例子吗?谢谢! 啊,我看错了,所以您在与 vms 不同的程序集中有视图,您需要为视图定位器提供逻辑以搜索其他命名空间,因为默认情况下它不知道在那里查找。我会更新我的答案 当我说 CM 我的意思是 Caliburn Micro :) 好的,但我刚开始接触 CM,所以请你详细解释一下,我真的不知道什么 更新了我的答案-我建议先阅读一些内容,熟悉简单的东西真的不应该花费超过几个小时,而要熟悉其余的东西则需要几天时间

以上是关于在尝试加载程序集 ID 65537 时 Microsoft .NET Framework 出错.服务器可能资源不的主要内容,如果未能解决你的问题,请参考以下文章

加载程序集及其依赖项

在运行时加载 2 个版本的程序集

加载程序集时发生冲突的依赖项

如何卸载已加载的程序集

尝试加载反应式程序集时,Expression Blend 4 失败

CreateInstanceAndUnwrap 无法加载程序集