Regex.CompileToAssembly Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Компилирует регулярные выражения и сохраняет их на диск в одной сборке.
Перегрузки
CompileToAssembly(RegexCompilationInfo[], AssemblyName, CustomAttributeBuilder[], String) |
Устаревшие..
Компилирует один или несколько указанных объектов Regex и указанный файл ресурсов в именованную сборку с указанными атрибутами. |
CompileToAssembly(RegexCompilationInfo[], AssemblyName) |
Устаревшие..
Компилирует один или несколько указанных Regex объектов в именованную сборку. |
CompileToAssembly(RegexCompilationInfo[], AssemblyName, CustomAttributeBuilder[]) |
Устаревшие..
Компилирует один или несколько указанных Regex объектов в именованную сборку с указанными атрибутами. |
Комментарии
Заметка
В .NET Core и .NET 5+вызовы метода Regex.CompileToAssembly
вызывают PlatformNotSupportedException. Написание сборки не поддерживается.
CompileToAssembly(RegexCompilationInfo[], AssemblyName, CustomAttributeBuilder[], String)
- Исходный код:
- Regex.cs
- Исходный код:
- Regex.cs
- Исходный код:
- Regex.cs
Внимание!
Regex.CompileToAssembly is obsolete and not supported. Use the GeneratedRegexAttribute with the regular expression source generator instead.
Компилирует один или несколько указанных объектов Regex и указанный файл ресурсов в именованную сборку с указанными атрибутами.
public:
static void CompileToAssembly(cli::array <System::Text::RegularExpressions::RegexCompilationInfo ^> ^ regexinfos, System::Reflection::AssemblyName ^ assemblyname, cli::array <System::Reflection::Emit::CustomAttributeBuilder ^> ^ attributes, System::String ^ resourceFile);
public static void CompileToAssembly (System.Text.RegularExpressions.RegexCompilationInfo[] regexinfos, System.Reflection.AssemblyName assemblyname, System.Reflection.Emit.CustomAttributeBuilder[]? attributes, string? resourceFile);
[System.Obsolete("Regex.CompileToAssembly is obsolete and not supported. Use the GeneratedRegexAttribute with the regular expression source generator instead.", DiagnosticId="SYSLIB0036", UrlFormat="https://aka.ms/dotnet-warnings/{0}")]
public static void CompileToAssembly (System.Text.RegularExpressions.RegexCompilationInfo[] regexinfos, System.Reflection.AssemblyName assemblyname, System.Reflection.Emit.CustomAttributeBuilder[]? attributes, string? resourceFile);
public static void CompileToAssembly (System.Text.RegularExpressions.RegexCompilationInfo[] regexinfos, System.Reflection.AssemblyName assemblyname, System.Reflection.Emit.CustomAttributeBuilder[] attributes, string resourceFile);
static member CompileToAssembly : System.Text.RegularExpressions.RegexCompilationInfo[] * System.Reflection.AssemblyName * System.Reflection.Emit.CustomAttributeBuilder[] * string -> unit
[<System.Obsolete("Regex.CompileToAssembly is obsolete and not supported. Use the GeneratedRegexAttribute with the regular expression source generator instead.", DiagnosticId="SYSLIB0036", UrlFormat="https://aka.ms/dotnet-warnings/{0}")>]
static member CompileToAssembly : System.Text.RegularExpressions.RegexCompilationInfo[] * System.Reflection.AssemblyName * System.Reflection.Emit.CustomAttributeBuilder[] * string -> unit
Public Shared Sub CompileToAssembly (regexinfos As RegexCompilationInfo(), assemblyname As AssemblyName, attributes As CustomAttributeBuilder(), resourceFile As String)
Параметры
- regexinfos
- RegexCompilationInfo[]
Массив, описывающий регулярные выражения для компиляции.
- assemblyname
- AssemblyName
Имя файла сборки.
- attributes
- CustomAttributeBuilder[]
Массив, определяющий атрибуты, применяемые к сборке.
- resourceFile
- String
Имя файла ресурсов Win32, включаемого в сборку.
- Атрибуты
Исключения
Значение свойства Nameassemblyname
параметра — пустая или пустая строка.
-или-
Шаблон регулярного выражения одного или нескольких объектов в regexinfos
содержит недопустимый синтаксис.
assemblyname
или regexinfos
null
.
Параметр resourceFile
обозначает недопустимый файл ресурсов Win32.
Не удается найти файл, указанный параметром resourceFile
.
Только .NET Core и .NET 5+ — создание сборки скомпилированных регулярных выражений не поддерживается.
Комментарии
Метод CompileToAssembly(RegexCompilationInfo[], AssemblyName, CustomAttributeBuilder[], String) создает сборку .NET Framework, в которой каждое регулярное выражение, определенное в массиве regexinfos
, представлено классом. Как правило, метод CompileToAssembly(RegexCompilationInfo[], AssemblyName, CustomAttributeBuilder[], String) вызывается из отдельного приложения, которое создает сборку скомпилированных регулярных выражений. Каждое регулярное выражение, включенное в сборку, имеет следующие характеристики:
Он является производным от класса Regex.
Оно назначается полное имя, определенное
fullnamespace
иname
параметрами соответствующего объекта RegexCompilationInfo.Он имеет конструктор по умолчанию (или без параметров).
Обычно код, который создает сборку и использует скомпилированное регулярное выражение, находится в сборке или приложении, отдельном от кода, создающего сборку.
Так как метод CompileToAssembly создает сборку .NET Framework из вызова метода вместо использования ключевого слова определения класса определенного языка (например, class
в C# или Class
...End Class
в Visual Basic), атрибуты .NET Framework не назначаются сборке с помощью стандартного синтаксиса атрибутов языка разработки. Параметр attributes
предоставляет альтернативный метод определения атрибутов, применяемых к сборке. Для каждого атрибута, который требуется применить к сборке, сделайте следующее:
Создайте массив объектов Type, представляющих типы параметров конструктора атрибутов, который требуется вызвать.
Получение объекта Type, представляющего класс атрибута, который требуется применить к новой сборке.
Вызовите метод GetConstructor объекта Type атрибута, чтобы получить объект ConstructorInfo, представляющий конструктор атрибутов, который требуется вызвать. Передайте метод GetConstructor массив объектов Type, представляющих типы параметров конструктора.
Создайте массив Object, определяющий параметры, передаваемые конструктору атрибута.
Создайте экземпляр объекта CustomAttributeBuilder путем передачи конструктора объекта ConstructorInfo, полученного на шаге 3, и массив Object, созданный на шаге 4.
Затем можно передать массив этих объектов CustomAttributeBuilder вместо параметра attributes
методу CompileToAssembly(RegexCompilationInfo[], AssemblyName, CustomAttributeBuilder[], String).
Примечания для тех, кто вызывает этот метод
Если вы разрабатываете систему с установленными версиями .NET Framework 4.5 или ее точками, вы используете метод .NET Framework 4 и используете метод CompileToAssembly(RegexCompilationInfo[], AssemblyName) для создания сборки, содержащей скомпилированные регулярные выражения. Попытка использовать одно из регулярных выражений в этой сборке в системе с .NET Framework 4 вызывает исключение. Чтобы обойти эту проблему, можно выполнить одно из следующих действий:
Создайте сборку, содержащую скомпилированные регулярные выражения в системе с .NET Framework 4 вместо более поздних версий.
Вместо вызова CompileToAssembly(RegexCompilationInfo[], AssemblyName) и получения скомпилированного регулярного выражения из сборки используйте статические или экземплярные методы Regex с параметром Compiled при создании экземпляра объекта Regex или вызове метода сопоставления шаблонов регулярных выражений.
См. также раздел
- компиляция и повторное использование
Применяется к
CompileToAssembly(RegexCompilationInfo[], AssemblyName)
- Исходный код:
- Regex.cs
- Исходный код:
- Regex.cs
- Исходный код:
- Regex.cs
Внимание!
Regex.CompileToAssembly is obsolete and not supported. Use the GeneratedRegexAttribute with the regular expression source generator instead.
Компилирует один или несколько указанных Regex объектов в именованную сборку.
public:
static void CompileToAssembly(cli::array <System::Text::RegularExpressions::RegexCompilationInfo ^> ^ regexinfos, System::Reflection::AssemblyName ^ assemblyname);
public static void CompileToAssembly (System.Text.RegularExpressions.RegexCompilationInfo[] regexinfos, System.Reflection.AssemblyName assemblyname);
[System.Obsolete("Regex.CompileToAssembly is obsolete and not supported. Use the GeneratedRegexAttribute with the regular expression source generator instead.", DiagnosticId="SYSLIB0036", UrlFormat="https://aka.ms/dotnet-warnings/{0}")]
public static void CompileToAssembly (System.Text.RegularExpressions.RegexCompilationInfo[] regexinfos, System.Reflection.AssemblyName assemblyname);
static member CompileToAssembly : System.Text.RegularExpressions.RegexCompilationInfo[] * System.Reflection.AssemblyName -> unit
[<System.Obsolete("Regex.CompileToAssembly is obsolete and not supported. Use the GeneratedRegexAttribute with the regular expression source generator instead.", DiagnosticId="SYSLIB0036", UrlFormat="https://aka.ms/dotnet-warnings/{0}")>]
static member CompileToAssembly : System.Text.RegularExpressions.RegexCompilationInfo[] * System.Reflection.AssemblyName -> unit
Public Shared Sub CompileToAssembly (regexinfos As RegexCompilationInfo(), assemblyname As AssemblyName)
Параметры
- regexinfos
- RegexCompilationInfo[]
Массив, описывающий регулярные выражения для компиляции.
- assemblyname
- AssemblyName
Имя файла сборки.
- Атрибуты
Исключения
Значение свойства Nameassemblyname
параметра — пустая или пустая строка.
-или-
Шаблон регулярного выражения одного или нескольких объектов в regexinfos
содержит недопустимый синтаксис.
assemblyname
или regexinfos
null
.
Только .NET Core и .NET 5+ — создание сборки скомпилированных регулярных выражений не поддерживается.
Примеры
В следующем примере создается сборка с именем RegexLib.dll. Сборка включает два скомпилированных регулярных выражения. Первый, Utilities.RegularExpressions.DuplicatedString
, соответствует двум идентичным смежным словам. Во-вторых, Utilities.RegularExpressions.EmailAddress
, проверяет, имеет ли строка правильный формат для адреса электронной почты.
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Text.RegularExpressions;
public class RegexCompilationTest
{
public static void Main()
{
RegexCompilationInfo expr;
List<RegexCompilationInfo> compilationList = new List<RegexCompilationInfo>();
// Define regular expression to detect duplicate words
expr = new RegexCompilationInfo(@"\b(?<word>\w+)\s+(\k<word>)\b",
RegexOptions.IgnoreCase | RegexOptions.CultureInvariant,
"DuplicatedString",
"Utilities.RegularExpressions",
true);
// Add info object to list of objects
compilationList.Add(expr);
// Define regular expression to validate format of email address
expr = new RegexCompilationInfo(@"^(?("")(""[^""]+?""@)|(([0-9A-Z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9A-Z])@))" +
@"(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9A-Z][-\w]*[0-9A-Z]\.)+[A-Z]{2,6}))$",
RegexOptions.IgnoreCase | RegexOptions.CultureInvariant,
"EmailAddress",
"Utilities.RegularExpressions",
true);
// Add info object to list of objects
compilationList.Add(expr);
// Generate assembly with compiled regular expressions
RegexCompilationInfo[] compilationArray = new RegexCompilationInfo[compilationList.Count];
AssemblyName assemName = new AssemblyName("RegexLib, Version=1.0.0.1001, Culture=neutral, PublicKeyToken=null");
compilationList.CopyTo(compilationArray);
Regex.CompileToAssembly(compilationArray, assemName);
}
}
Imports System.Collections.Generic
Imports System.Reflection
Imports System.Text.RegularExpressions
Module RegexCompilationTest
Public Sub Main()
Dim expr As RegexCompilationInfo
Dim compilationList As New List(Of RegexCompilationInfo)
' Define regular expression to detect duplicate words
expr = New RegexCompilationInfo("\b(?<word>\w+)\s+(\k<word>)\b", _
RegexOptions.IgnoreCase Or RegexOptions.CultureInvariant, _
"DuplicatedString", _
"Utilities.RegularExpressions", _
True)
' Add info object to list of objects
compilationList.Add(expr)
' Define regular expression to validate format of email address
expr = New RegexCompilationInfo("^(?("")(""[^""]+?""@)|(([0-9A-Z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9A-Z])@))" + _
"(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9A-Z][-\w]*[0-9A-Z]\.)+[A-Z]{2,6}))$", _
RegexOptions.IgnoreCase Or RegexOptions.CultureInvariant, _
"EmailAddress", _
"Utilities.RegularExpressions", _
True)
' Add info object to list of objects
compilationList.Add(expr)
' Generate assembly with compiled regular expressions
Dim compilationArray(compilationList.Count - 1) As RegexCompilationInfo
Dim assemName As New AssemblyName("RegexLib, Version=1.0.0.1001, Culture=neutral, PublicKeyToken=null")
compilationList.CopyTo(compilationArray)
Regex.CompileToAssembly(compilationArray, assemName)
End Sub
End Module
Регулярное выражение, которое проверяет строку для повторяющихся слов, затем создается экземпляр и используется в следующем примере.
using System;
using Utilities.RegularExpressions;
public class CompiledRegexUsage
{
public static void Main()
{
string text = "The the quick brown fox fox jumps over the lazy dog dog.";
DuplicatedString duplicateRegex = new DuplicatedString();
if (duplicateRegex.Matches(text).Count > 0)
Console.WriteLine("There are {0} duplicate words in \n '{1}'",
duplicateRegex.Matches(text).Count, text);
else
Console.WriteLine("There are no duplicate words in \n '{0}'",
text);
}
}
// The example displays the following output to the console:
// There are 3 duplicate words in
// 'The the quick brown fox fox jumps over the lazy dog dog.'
Imports Utilities.RegularExpressions
Module CompiledRegexUsage
Public Sub Main()
Dim text As String = "The the quick brown fox fox jumps over the lazy dog dog."
Dim duplicateRegex As New DuplicatedString()
If duplicateRegex.Matches(text).Count > 0 Then
Console.WriteLine("There are {0} duplicate words in {2} '{1}'", _
duplicateRegex.Matches(text).Count, text, vbCrLf)
Else
Console.WriteLine("There are no duplicate words in {1} '{0}'", _
text, vbCrLf)
End If
End Sub
End Module
' The example displays the following output to the console:
' There are 3 duplicate words in
' 'The the quick brown fox fox jumps over the lazy dog dog.'
Для успешной компиляции этого второго примера требуется ссылка на RegexLib.dll (сборка, созданная в первом примере) для добавления в проект.
Комментарии
Метод CompileToAssembly(RegexCompilationInfo[], AssemblyName) создает сборку .NET Framework, в которой каждое регулярное выражение, определенное в массиве regexinfos
, представлено классом. Как правило, метод CompileToAssembly(RegexCompilationInfo[], AssemblyName) вызывается из отдельного приложения, которое создает сборку скомпилированных регулярных выражений. Каждое регулярное выражение, включенное в сборку, имеет следующие характеристики:
Он является производным от класса Regex.
Оно назначается полное имя, определенное
fullnamespace
иname
параметрами соответствующего объекта RegexCompilationInfo.Он имеет конструктор по умолчанию (или без параметров).
Обычно код, который создает сборку и использует скомпилированное регулярное выражение, находится в сборке или приложении, отдельном от кода, создающего сборку.
Примечания для тех, кто вызывает этот метод
Если вы разрабатываете систему с установленными версиями .NET Framework 4.5 или ее точками, вы используете метод .NET Framework 4 и используете метод CompileToAssembly(RegexCompilationInfo[], AssemblyName) для создания сборки, содержащей скомпилированные регулярные выражения. Попытка использовать одно из регулярных выражений в этой сборке в системе с .NET Framework 4 вызывает исключение. Чтобы обойти эту проблему, можно выполнить одно из следующих действий:
Создайте сборку, содержащую скомпилированные регулярные выражения в системе с .NET Framework 4 вместо более поздних версий.
Вместо вызова CompileToAssembly(RegexCompilationInfo[], AssemblyName) и получения скомпилированного регулярного выражения из сборки используйте статические или экземплярные методы Regex с параметром Compiled при создании экземпляра объекта Regex или вызове метода сопоставления шаблонов регулярных выражений.
См. также раздел
- компиляция и повторное использование
Применяется к
CompileToAssembly(RegexCompilationInfo[], AssemblyName, CustomAttributeBuilder[])
- Исходный код:
- Regex.cs
- Исходный код:
- Regex.cs
- Исходный код:
- Regex.cs
Внимание!
Regex.CompileToAssembly is obsolete and not supported. Use the GeneratedRegexAttribute with the regular expression source generator instead.
Компилирует один или несколько указанных Regex объектов в именованную сборку с указанными атрибутами.
public:
static void CompileToAssembly(cli::array <System::Text::RegularExpressions::RegexCompilationInfo ^> ^ regexinfos, System::Reflection::AssemblyName ^ assemblyname, cli::array <System::Reflection::Emit::CustomAttributeBuilder ^> ^ attributes);
public static void CompileToAssembly (System.Text.RegularExpressions.RegexCompilationInfo[] regexinfos, System.Reflection.AssemblyName assemblyname, System.Reflection.Emit.CustomAttributeBuilder[]? attributes);
[System.Obsolete("Regex.CompileToAssembly is obsolete and not supported. Use the GeneratedRegexAttribute with the regular expression source generator instead.", DiagnosticId="SYSLIB0036", UrlFormat="https://aka.ms/dotnet-warnings/{0}")]
public static void CompileToAssembly (System.Text.RegularExpressions.RegexCompilationInfo[] regexinfos, System.Reflection.AssemblyName assemblyname, System.Reflection.Emit.CustomAttributeBuilder[]? attributes);
public static void CompileToAssembly (System.Text.RegularExpressions.RegexCompilationInfo[] regexinfos, System.Reflection.AssemblyName assemblyname, System.Reflection.Emit.CustomAttributeBuilder[] attributes);
static member CompileToAssembly : System.Text.RegularExpressions.RegexCompilationInfo[] * System.Reflection.AssemblyName * System.Reflection.Emit.CustomAttributeBuilder[] -> unit
[<System.Obsolete("Regex.CompileToAssembly is obsolete and not supported. Use the GeneratedRegexAttribute with the regular expression source generator instead.", DiagnosticId="SYSLIB0036", UrlFormat="https://aka.ms/dotnet-warnings/{0}")>]
static member CompileToAssembly : System.Text.RegularExpressions.RegexCompilationInfo[] * System.Reflection.AssemblyName * System.Reflection.Emit.CustomAttributeBuilder[] -> unit
Public Shared Sub CompileToAssembly (regexinfos As RegexCompilationInfo(), assemblyname As AssemblyName, attributes As CustomAttributeBuilder())
Параметры
- regexinfos
- RegexCompilationInfo[]
Массив, описывающий регулярные выражения для компиляции.
- assemblyname
- AssemblyName
Имя файла сборки.
- attributes
- CustomAttributeBuilder[]
Массив, определяющий атрибуты, применяемые к сборке.
- Атрибуты
Исключения
Значение свойства Nameassemblyname
параметра — пустая или пустая строка.
-или-
Шаблон регулярного выражения одного или нескольких объектов в regexinfos
содержит недопустимый синтаксис.
assemblyname
или regexinfos
null
.
Только .NET Core и .NET 5+ — создание сборки скомпилированных регулярных выражений не поддерживается.
Примеры
В следующем примере создается сборка с именем RegexLib.dll и применяется к нему атрибут AssemblyTitleAttribute. Сборка включает два скомпилированных регулярных выражения. Первый, Utilities.RegularExpressions.DuplicatedString
, соответствует двум идентичным смежным словам. Во-вторых, Utilities.RegularExpressions.EmailAddress
, проверяет, имеет ли строка правильный формат для адреса электронной почты.
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Reflection.Emit;
using System.Text.RegularExpressions;
public class RegexCompilationTest
{
public static void Main()
{
RegexCompilationInfo expr;
List<RegexCompilationInfo> compilationList = new List<RegexCompilationInfo>();
// Define regular expression to detect duplicate words
expr = new RegexCompilationInfo(@"\b(?<word>\w+)\s+(\k<word>)\b",
RegexOptions.IgnoreCase | RegexOptions.CultureInvariant,
"DuplicatedString",
"Utilities.RegularExpressions",
true);
// Add info object to list of objects
compilationList.Add(expr);
// Define regular expression to validate format of email address
expr = new RegexCompilationInfo(@"^(?("")(""[^""]+?""@)|(([0-9A-Z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9A-Z])@))" +
@"(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9A-Z][-\w]*[0-9A-Z]\.)+[zA-Z]{2,6}))$",
RegexOptions.IgnoreCase | RegexOptions.CultureInvariant,
"EmailAddress",
"Utilities.RegularExpressions",
true);
// Add info object to list of objects
compilationList.Add(expr);
// Apply AssemblyTitle attribute to the new assembly
//
// Define the parameter(s) of the AssemblyTitle attribute's constructor
Type[] parameters = { typeof(string) };
// Define the assembly's title
object[] paramValues = { "General-purpose library of compiled regular expressions" };
// Get the ConstructorInfo object representing the attribute's constructor
ConstructorInfo ctor = typeof(System.Reflection.AssemblyTitleAttribute).GetConstructor(parameters);
// Create the CustomAttributeBuilder object array
CustomAttributeBuilder[] attBuilder = { new CustomAttributeBuilder(ctor, paramValues) };
// Generate assembly with compiled regular expressions
RegexCompilationInfo[] compilationArray = new RegexCompilationInfo[compilationList.Count];
AssemblyName assemName = new AssemblyName("RegexLib, Version=1.0.0.1001, Culture=neutral, PublicKeyToken=null");
compilationList.CopyTo(compilationArray);
Regex.CompileToAssembly(compilationArray, assemName, attBuilder);
}
}
Imports System.Collections.Generic
Imports System.Reflection
Imports System.Reflection.Emit
Imports System.Text.RegularExpressions
Module RegexCompilationTest
Public Sub Main()
Dim expr As RegexCompilationInfo
Dim compilationList As New List(Of RegexCompilationInfo)
' Define regular expression to detect duplicate words
expr = New RegexCompilationInfo("\b(?<word>\w+)\s+(\k<word>)\b", _
RegexOptions.IgnoreCase Or RegexOptions.CultureInvariant, _
"DuplicatedString", _
"Utilities.RegularExpressions", _
True)
' Add info object to list of objects
compilationList.Add(expr)
' Define regular expression to validate format of email address
expr = New RegexCompilationInfo("^(?("")(""[^""]+?""@)|(([0-9A-Z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9A-Z])@))" + _
"(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9A-Z][-\w]*[0-9A-Z]\.)+[A-Z]{2,6}))$", _
RegexOptions.IgnoreCase Or RegexOptions.CultureInvariant, _
"EmailAddress", _
"Utilities.RegularExpressions", _
True)
' Add info object to list of objects
compilationList.Add(expr)
' Apply AssemblyTitle attribute to the new assembly
'
' Define the parameter(s) of the AssemblyTitle attribute's constructor
Dim params() As Type = { GetType(String) }
' Define the assembly's title
Dim paramValues() As Object = { "General-purpose library of compiled regular expressions" }
' Get the ConstructorInfo object representing the attribute's constructor
Dim ctor As ConstructorInfo = GetType(System.Reflection.AssemblyTitleAttribute).GetConstructor(params)
' Create the CustomAttributeBuilder object array
Dim attBuilder() As CustomAttributeBuilder = { New CustomAttributeBuilder(ctor, paramValues) }
' Generate assembly with compiled regular expressions
Dim compilationArray(compilationList.Count - 1) As RegexCompilationInfo
Dim assemName As New AssemblyName("RegexLib, Version=1.0.0.1001, Culture=neutral, PublicKeyToken=null")
compilationList.CopyTo(compilationArray)
Regex.CompileToAssembly(compilationArray, assemName, attBuilder)
End Sub
End Module
Вы можете убедиться, что атрибут AssemblyTitleAttribute применен к сборке, проверив его манифест с помощью служебной программы отражения, например ILDasm.
Регулярное выражение, которое проверяет строку для повторяющихся слов, затем создается экземпляр и используется в следующем примере.
using System;
using Utilities.RegularExpressions;
public class CompiledRegexUsage
{
public static void Main()
{
string text = "The the quick brown fox fox jumps over the lazy dog dog.";
DuplicatedString duplicateRegex = new DuplicatedString();
if (duplicateRegex.Matches(text).Count > 0)
Console.WriteLine("There are {0} duplicate words in \n '{1}'",
duplicateRegex.Matches(text).Count, text);
else
Console.WriteLine("There are no duplicate words in \n '{0}'",
text);
}
}
// The example displays the following output to the console:
// There are 3 duplicate words in
// 'The the quick brown fox fox jumps over the lazy dog dog.'
Imports Utilities.RegularExpressions
Module CompiledRegexUsage
Public Sub Main()
Dim text As String = "The the quick brown fox fox jumps over the lazy dog dog."
Dim duplicateRegex As New DuplicatedString()
If duplicateRegex.Matches(text).Count > 0 Then
Console.WriteLine("There are {0} duplicate words in {2} '{1}'", _
duplicateRegex.Matches(text).Count, text, vbCrLf)
Else
Console.WriteLine("There are no duplicate words in {1} '{0}'", _
text, vbCrLf)
End If
End Sub
End Module
' The example displays the following output to the console:
' There are 3 duplicate words in
' 'The the quick brown fox fox jumps over the lazy dog dog.'
Для успешной компиляции этого второго примера требуется ссылка на RegexLib.dll (сборка, созданная в первом примере) для добавления в проект.
Комментарии
Метод CompileToAssembly(RegexCompilationInfo[], AssemblyName, CustomAttributeBuilder[]) создает сборку .NET Framework, в которой каждое регулярное выражение, определенное в массиве regexinfos
, представлено классом. Как правило, метод CompileToAssembly(RegexCompilationInfo[], AssemblyName, CustomAttributeBuilder[]) вызывается из отдельного приложения, которое создает сборку скомпилированных регулярных выражений. Каждое регулярное выражение, включенное в сборку, имеет следующие характеристики:
Он является производным от класса Regex.
Оно назначается полное имя, определенное
fullnamespace
иname
параметрами соответствующего объекта RegexCompilationInfo.Он имеет конструктор по умолчанию (или без параметров).
Обычно код, который создает сборку и использует скомпилированное регулярное выражение, находится в сборке или приложении, отдельном от кода, создающего сборку.
Так как метод CompileToAssembly создает сборку .NET Framework из вызова метода вместо использования ключевого слова определения класса определенного языка (например, class
в C# или Class
...End Class
в Visual Basic), атрибуты .NET Framework не назначаются сборке с помощью стандартного синтаксиса атрибутов языка разработки. Параметр attributes
предоставляет альтернативный метод определения атрибутов, применяемых к сборке. Для каждого атрибута, который требуется применить к сборке, сделайте следующее:
Создайте массив объектов Type, представляющих типы параметров конструктора атрибутов, который требуется вызвать.
Получение объекта Type, представляющего класс атрибута, который требуется применить к новой сборке.
Вызовите метод GetConstructor объекта Type атрибута, чтобы получить объект ConstructorInfo, представляющий конструктор атрибутов, который требуется вызвать. Передайте метод GetConstructor массив объектов Type, представляющих типы параметров конструктора.
Создайте массив Object, определяющий параметры, передаваемые конструктору атрибута.
Создайте экземпляр объекта CustomAttributeBuilder путем передачи конструктора объекта ConstructorInfo, полученного на шаге 3, и массив Object, созданный на шаге 4.
Затем можно передать массив этих объектов CustomAttributeBuilder вместо параметра attributes
методу Regex.CompileToAssembly(RegexCompilationInfo[], AssemblyName, CustomAttributeBuilder[]).
Примечания для тех, кто вызывает этот метод
Если вы разрабатываете систему с установленными версиями .NET Framework 4.5 или ее точками, вы используете метод .NET Framework 4 и используете метод CompileToAssembly(RegexCompilationInfo[], AssemblyName) для создания сборки, содержащей скомпилированные регулярные выражения. Попытка использовать одно из регулярных выражений в этой сборке в системе с .NET Framework 4 вызывает исключение. Чтобы обойти эту проблему, можно выполнить одно из следующих действий:
Создайте сборку, содержащую скомпилированные регулярные выражения в системе с .NET Framework 4 вместо более поздних версий.
Вместо вызова CompileToAssembly(RegexCompilationInfo[], AssemblyName) и получения скомпилированного регулярного выражения из сборки используйте статические или экземплярные методы Regex с параметром Compiled при создании экземпляра объекта Regex или вызове метода сопоставления шаблонов регулярных выражений.
См. также раздел
- компиляция и повторное использование