powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Отладка dll
5 сообщений из 5, страница 1 из 1
Отладка dll
    #39800550
Алексаша
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.

Знание C# новичок.

Есть необходимость расширить функционал (регулярные выражения) MS SQL SERVER с помощью CLR процедур. Поэтому решил собрать dll на шарпе. Примеры dll благо есть.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
using System;
using System.Collections;
//using System.Collections.Generic;
//using System.Linq;
//using System.Text;
using System.Data.SqlTypes;
using System.Text.RegularExpressions;
using Microsoft.SqlServer.Server;

namespace CLR_RegEx
{
    public static class FuncRegEx
    {
        //*******************************************************************************************************
        //ф-ция возвращает булево о вхождениее выражения в строку
        [SqlFunction(IsDeterministic = true)]
        public static SqlBoolean FRgExIsMatch(SqlString str, SqlString pattern)
        {
            var reg = new Regex(pattern.ToString());
            return (SqlBoolean)reg.IsMatch(str.ToString());
        }
        //*********************************************************************************************************
        //фунция возвращает позицию вхождения рег. выражения и строку
        [SqlFunction(IsDeterministic = true)]
        public static SqlInt16 FRgExPos(SqlString text, SqlString pattern, ref SqlString val)
        {
            SqlInt16 returnVal = -1;
            try
            {
                string myText = text.ToString();
                string myPattern = pattern.ToString();
                Match match = Regex.Match(myText, myPattern);
                if (match.Success)
                {
                    returnVal = (SqlInt16)match.Index; // позиция
                    val = (SqlString)match.Value; // найденная строка
                }
            }
            catch
            {
                returnVal = -1;
            }

            return returnVal;
        }
        //***********************************************************************************************************
        //фунция заменяет вхождение шаблона на указанную строку
        [SqlFunction(IsDeterministic = true)]
        public static SqlString FRgExReplace(SqlString inputSting, SqlString pattern, SqlString replacement)
        {
            try
            {
                return Regex.Replace(inputSting.ToString(), pattern.ToString(), replacement.ToString(), RegexOptions.IgnoreCase);
            }
            catch
            {
                return "";
            }
        }

        //************************************************************************************************************
        public class RegExMatchResult
        { // Содержит результаты поиска
            public RegExMatchResult(int id, string substr, int firstIndex, int length)
            {
                this.id = id; 
                this.substr = substr; 
                this.firstIndex = firstIndex; 
                this.length = length; 
            }

            public int id; // Порядковый номер в наборе
            public string substr; // найденная подстрока
            public int firstIndex; // индекс вхождения подстроки в строке
            public int length; // Длина найденной подстроки
        }
   
        //Тег, определяющий, что данная функция возвращает таблицу
        [SqlFunction(FillRowMethodName = "FillRowMatchResult",
        TableDefinition = "id int, substr nvarchar(4000), FirstIndex int, Length int")]
        public static System.Collections.IEnumerable FRgExFind(String inputSting, String pattern)
        {
            int i = 0;
            ArrayList resultCollection = new ArrayList();
            Regex rgx = new Regex(pattern);

            foreach (Match match in rgx.Matches(inputSting))
            {
                // Console.WriteLine("Found '{0}' at position {1}", match.Value, match.Index);
                resultCollection.Add(new RegExMatchResult(i, match.Value, match.Index, match.Value.Length));
                i++;
            }
            return resultCollection;
        }

        //Функция заполнения таблицы
        public static void FillRowMatchResult(Object obj, out int id, out string substr, out int firstIndex, out int length)
        {
            //Возвращает в таблицу строку
            RegExMatchResult M = (RegExMatchResult)obj;
            id = M.id;
            substr = M.substr;
            firstIndex = M.firstIndex;
            length = M.length;
        }
    } 
}



Стал вопрос отладки этой библиотеки. Добавил в студии форму для ввода значений и вывода результата
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using CLR_RegEx;
using System.Data.SqlTypes;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            String str, pattern;
            str = Str_richTextBox.Text;
            pattern = Pattern_richTextBox.Text;

            bool b;

            b = (bool)FuncRegEx.FRgExIsMatch((SqlString)str, (SqlString)pattern);

            if (b) {
                textBox1.Text = "Yes";
            }
            else {
                textBox1.Text = "No";
            }

        }

        private void button2_Click(object sender, EventArgs e)
        {
            String str, pattern;
            str = Str_richTextBox.Text;
            pattern = Pattern_richTextBox.Text;
            int p;
            SqlString ret = "";
            p = (int)FuncRegEx.FRgExPos((SqlString)str, (SqlString)pattern, ref ret);

            textBox1.Text = p.ToString() + " " + ret.ToString();

        }

        private void button3_Click(object sender, EventArgs e)
        {
            String str, pattern, rpl;
            str = Str_richTextBox.Text;
            pattern = Pattern_richTextBox.Text;
            rpl = replacementTextBox.Text;

            textBox1.Text = (String)FuncRegEx.FRgExReplace((SqlString)str, (SqlString)pattern, (SqlString)rpl);
        }

        private void button4_Click(object sender, EventArgs e)
        {
            String str, pattern, rpl;
            str = Str_richTextBox.Text;
            pattern = Pattern_richTextBox.Text;


        }
    }
}



Проект вышеописанного прилагаю.
Вопрос как на форме в неком гриде отразить результат выполнения FRgExFind библиотеки она возвращает таблицу.
...
Рейтинг: 0 / 0
Отладка dll
    #39800569
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексаша,
Есть отладка логированием. Прямо в консоль.
...
Рейтинг: 0 / 0
Отладка dll
    #39800579
Алексаша
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123,

спасибо. просто хотелось бы чуток прокачать понятия об шарпе, поэтому выбрал форму чтоб поиграться с компонентами ну т.д.
...
Рейтинг: 0 / 0
Отладка dll
    #39800580
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексаша,
Ну, логируй в таблу, в Lisr, в Memo.
...
Рейтинг: 0 / 0
Отладка dll
    #39800631
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
подключаетесь отладчиком с тому процессу, который загружает вашу сборку и отлаживайте.
если это процесс mssql сервера, значит к нему или одному из них, можно глянуть по модулям в windbg или в vs отладчике.
затем подключить pdb файл вашей сборки в отладчик и указать ему, где валяются исходники. VS сама не плохо умеет всё находить, если отлаживается текущий проект.
всё
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Отладка dll
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]