c# - CLR 函数中的反序列化失败

标签 c# tsql sqlclr

我用C#编写了一些文本的音标转换例程。这些例程需要一堆 aof 定义的转换规则(搜索字符串/替换字符串)。这个想法是将这些规则存储为程序集中的嵌入式资源,然后从中读取规则。反序列化的起点如下

public static phonet42n.Core.Rules Deserialize(phonet42n.Core.Rules.Ressources ressource)
{
    string ressourceName;
    phonet42n.Core.Rules returnValue;
    System.Xml.XmlReader reader;
    System.Xml.Serialization.XmlSerializer xmlSerializer;
    phonet42n.Core.SerializableRules serializeableRules;

    returnValue = new phonet42n.Core.Rules();

    switch (ressource)
    {
        case Ressources.German_01:
            ressourceName = RESSOURCE_XML_GERMAN_01;
            break;
        case Ressources.German_02:
            ressourceName = RESSOURCE_XML_GERMAN_02;
            break;
        default:
            ressourceName = RESSOURCE_XML_GERMAN_01;
            break;
    }

    using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(ressourceName))
    {
        using (reader = System.Xml.XmlReader.Create(stream))
        {
            xmlSerializer = new System.Xml.Serialization.XmlSerializer(typeof(phonet42n.Core.SerializableRules));
            serializeableRules = (phonet42n.Core.SerializableRules)xmlSerializer.Deserialize(reader);
        }
    }

    foreach (phonet42n.Core.Rule entry in serializeableRules.Rules)
    {
        if (entry.SearchString != null && entry.SearchString.Length > 0)
        {
            returnValue.Add(entry.Index, entry);
        }
    }
    return returnValue;
}

当在常规可执行文件中执行时,该应用程序工作正常。

在 SQL Server 中执行注册函数时出现以下错误:

SELECT [dbo].[Phonet42n]('mayer', 1)

产生...

Meldung 6522, Ebene 16, Status 1, Zeile 22
.NET Framework-Fehler beim Ausführen der benutzerdefinierten Routine oder des benutzerdefinierten Aggregats 'Phonet42n':
System.InvalidOperationException: Fehler im XML-Dokument (3,4). ---> System.MethodAccessException: Fehler beim Versuch der Methode "Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReader1.Read8_SerializableRules(Boolean, Boolean)", auf Methode "phonet42n.Core.Rule..ctor()" zuzugreifen.
System.MethodAccessException:
bei System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
bei System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
bei System.Activator.CreateInstance(Type type, Boolean nonPublic)
bei System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes, StackCrawlMark& stackMark)
bei System.Activator.CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
bei System.Activator.CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture)
bei Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReader1.Read8_SerializableRules(Boolean isNullable, Boolean checkType)
bei Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReader1.Read19_Rules()
System.InvalidOperationException:
bei System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
bei System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader)
bei phonet42n.Core.Rules.Deserialize(Ressources ressource)
bei phonet42n.Core.Rules..ctor(Ressources ressource, Characters characters)
bei phonet42n.Core.HashTable..ctor(Ressources ressource)
bei phonet42n.Core.Match..ctor(Re...

有什么想法吗?

最佳答案

每当出现安全异常时,您可以首先尝试将程序集设置为 PERMISSION_SET = EXTERNAL_ACCESS,如果这不起作用,您可以尝试 UNSAFE。但是,如果有人试图动态加载程序集,那么即使对于标记为 UNSAFE 的程序集,也应禁止这样做。

由于这里的问题是想要包含一套规则,这可能会在另一个大会上完成。然后主程序集可以引用包含规则的程序集,而您只需先将包含规则的程序集加载到 SQL Server 中即可。这将允许两个程序集保持标记为 SAFE

当然,如果没有迫切需要将规则分开,那么您也可以将它们直接放在类中的集合中。

关于c# - CLR 函数中的反序列化失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39750330/

相关文章:

c# - 关于接口(interface)实现和可扩展性的架构问题

c# - 如何从 Base Controller 中的 OnActionExecuting 重定向?

sql - 从日期时间获取时间间隔

c# - 从 SQLCLR 调用时,带有 Remove=true 的 WinSCP Session.PutFiles 获取 "Error deleting file System Error. Code: 5"但在 SSIS 脚本任务中工作

sql-server - SQL Server 创建程序集

c# - 如何在 MVVM Caliburn.Micro 中绑定(bind)用户控件?

c# - 在 umbraco 中为节点创建默认子节点

sql-server - T-SQL函数可以返回用户定义的表类型吗?

SQL case 语句 - 3 个子句?

c# - 尝试发布 SQL CLR 数据库的日期时间类型不匹配