Выполните.NET 3,0 кода от Office 2003

Убедитесь, что ваш движок регулярных выражений поддерживает \R в качестве сокращенного класса символов, и вам не нужно беспокоиться о различных комбинациях перевода строки / перевода строки Unicode. Если все реализовано правильно, вы можете прозрачно сопоставить все различные окончания строк ascii или Unicode, используя \R.

В Unicode вам нужно обнаружить NEL (конец строки OS / 390, \ x85) LS (разделитель строк, \ x2028) и PS (разделитель абзацев, \ x2029), если вы хотите быть полностью кроссплатформенным в эти дни.

Это спорно ли LS, NEL, и PS следует рассматривать как разрыв строки, строки окончания или белое пространство. Стандарт XML 1.0, например, , не распознает NEL как символ перевода строки. ECMAScript рассматривает LS и PS как разрывы строк, но NEL как пробелы. Регулярные выражения Perl unicode будут обрабатывать VT, FF, CR, CRLF, NEL, LS и PS как разрывы строк для целей ^ и $ регулярные выражения метасимволов.

Руководство по внедрению Unicode (раздел 5.8 и таблица 5.3), вероятно, является лучшим выбором для окончательного подхода к пониманию «новой строки».

Если вас интересует только ascii с классическими вариантами DOS / Windows / Unix / Mac, регулярное выражение, эквивалентное \R, равно (?>\r\n|[\r\n])

В Unicode, эквивалентно \R ] (?>\r\n|\n|\x0b|\f|\r|\x85|\x2028|\x2029) \x0b там есть вертикальная вкладка; еще раз, это может соответствовать или не соответствовать вашему определению, что такое разрыв строки, но это соответствует рекомендации имплантации Unicode. (FF или \x0C не включены в регулярное выражение, так как фид форм - это новая страница, а не новая строка в определении.)

8
задан Peter Mortensen 4 November 2009 в 15:00
поделиться

2 ответа

Хорошо, после некоторых довольно хороших идей от Торстена Дитмара я, наконец, заставил эту штуку работать. Некоторые вещи, которые возникли во время нашего обсуждения, и другие вещи, которые я нашел в сети:

  1. .NET framework должна быть установлена ​​на целевой машине.
  2. .Net Поддержка программирования должна быть установлена ​​на целевой машине.
  3. В AssemblyInfo.cs убедитесь, что вы установили

    [сборка: ComVisible ( true )]

  4. Как указал Торстен, вам необходимо иметь открытый конструктор без параметров в вашем классе .Net.

  5. Обязательно установите флажок «Зарегистрироваться для COM-взаимодействия» на вкладке «Сборка» на странице «Свойства» проекта.
  6. Не забудьте подписать проект, используя вкладку «Подписание» на странице «Свойства» проекта.
  7. Зарегистрируйтесь вашу DLL на целевой машине, выполнив эту команду. Параметр / codebase , похоже, помог мне. Путь к библиотеке типов (.tlb) или DLL значения не имеет. Вы можете найти regasm в C: \ Windows \ Microsoft.Net \ Framework \ v2.050727 \ RegAsm.exe

    regasm c: \ CompanyName.Net.dll /tlb:CompanyName.Net.tlb / codebase

  8. ] Укажите ссылку на файл .tlb в редакторе VBA, выбрав Инструменты> Ссылки.

  9. Перетащите dll из C: \ в ваш GAC на C:
10
ответ дан 5 December 2019 в 14:04
поделиться

Вам нужен явный конструктор без параметров в вашем классе COM. Измените определение класса на:

namespace CompanyName.Net
{
    [Guid("F7075E8D-A6BD-4590-A3B5-7728C94E372F")]
    [ClassInterface(ClassInterfaceType.AutoDual)]
    [ProgId("CompanyName.Net.Webrequest")]
    public class WebRequest
    {
        public string Result { get; private set; }
        public string Url { get; set; }
        public string StatusDescription { get; private set; }
        public HttpStatusCode StatusCode { get; private set; }

        public WebRequest()
        {
        }

        public string GetResponse(string url)
        {
            System.Net.WebRequest webreq = System.Net.WebRequest.Create(url);
            HttpWebResponse response = (HttpWebResponse) webreq.GetResponse();
            // Store the status.
            StatusDescription = response.StatusDescription;
            StatusCode = response.StatusCode;
            // Get the stream containing content returned by the server.
            Stream dataStream = response.GetResponseStream();
            // Open the stream using a StreamReader for easy access.
            StreamReader reader = new StreamReader(dataStream);
            // Read the content.
            Result = reader.ReadToEnd();
            // Cleanup the streams and the response.
            reader.Close();
            dataStream.Close();
            response.Close();
            //return the response
            return Result;
        }
    }
}

Это должно сработать.

2
ответ дан 5 December 2019 в 14:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: