Отправляет email-рассылки с помощью сервиса Sendsay

RFpro.ru: Microsoft .NET

  Все выпуски  

RFpro.ru: Microsoft .NET


РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты по данной тематике

Асмик Гаряка
Статус: Советник
Рейтинг: 11034
∙ повысить рейтинг »
LfiN
Статус: Специалист
Рейтинг: 711
∙ повысить рейтинг »
PsySex
Статус: Профессионал
Рейтинг: 418
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Microsoft .NET : C#

Номер выпуска:264
Дата выхода:09.10.2015, 15:21
Администратор рассылки:Alexey G. Gladenyuk (Управляющий)
Подписчиков / экспертов:7 / 5
Вопросов / ответов:3 / 4

Консультация # 174205: Привет. Если использовать .net framework в коммерческом проекте, придется ли платить за использование фреймворка? Или платно только использование среды разработки Visual Studio? Насколько кроссплатформенный .net framework? То есть, можно будет бес проблем перенести продукт из Windows в Linux, если продукт web-приложение? Спасибо. ...


Консультация # 165201: Здравствуйте, ув. эксперты. Вопрос по механизму reflection. Сразу оговорюсь. Структура задачи не подлежит реформированию. Она должна работать именно в той конструкции, в к. она сейчас построена. Итак. Имеется контрол на форме (по контролу был мой же вопрос №163879). Из себя он представляет текстовое поле с кнопкой в правом углу. Пр...
Консультация # 180598: Здравствуйте, уважаемые эксперты! Помоги, пожалуйста, решить задачу: Разработать консольную программу на языке C# (Предусмотреть меню, позволяющее проверить все методы класса): Составить описание класса для определения одномерных массивов целых чисел. Предусмотреть возможность обращения к отдельному элементу массива с контролем выхода...

Консультация # 174205:

Привет.
Если использовать .net framework в коммерческом проекте, придется ли платить за использование фреймворка? Или платно только использование среды разработки Visual Studio? Насколько кроссплатформенный .net framework? То есть, можно будет бес проблем перенести продукт из Windows в Linux, если продукт web-приложение?
Спасибо.

Дата отправки: 14.11.2009, 03:57
Вопрос задал: Maksim Trofimov
Всего ответов: 2
Страница онлайн-консультации »


Консультирует Челноков Виктор Альбертович:

Здравствуйте, Maksim Trofimov.
По своей сути .net framework это уже часть опрационной системы, поэтому платы никакой не предусмотренно и распостраняется Микрософт бесплатно. Visual Studio это комерческое по. Но можно использовать и открытое по например SharpDevelop http://www.sharpdevelop.net/OpenSource/SD/. Кроссплатформенность сам не использовал но говорят работает нормально.

Консультировал: Челноков Виктор Альбертович
Дата отправки: 14.11.2009, 08:08

5
нет комментария
-----
Дата оценки: 14.11.2009, 13:35

Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Evgenijm:

Здравствуйте, Maksim Trofimov.

1 Фреймворк бесплатен. Также есть бесплатная линейка студии от Майкрософт: Express Edition. Я ей особо не пользовался, но проблемы возникали только с С++. Еще есть открытый Монодевелоп.

2 Майкрософт поддерживает .Net для настольных и мобильных Windows. Возможно, под Мак тоже. Новелл ведет опенсорсный проект mono. Причем, Майкрософт не возражает, даже помогает потихоньку. Плохо, что графика там реализована через Wine, против которого Майкрософт возражает. И который никогда не будет хорошим продуктом. Некоторые функции под Linux вызывают ошибку или не срабатывают. Но не самые важные. Несрабатывают обычно из-за пробелов в Вайне. Надо тщательно тестировать проект. И моно заметно отстает от .Net: 3я версия, вроде, так и не поддерживается.
Остальные "реализации", как и у Явы - это продукты жизнедеятельности оголтелых опенсорсников. Там ничего не работает, но зато проект независим ни от кого, и они уверены в его открыт ости. Никакой практической пользы от таких проектов нет.

3 Веб-приложение - это под ИИС? У Аппача есть плагин, который обрабатывает АСП. Но как он работает не могу сказать. Если же в смысле, что работающее с сетью - наверняка работать будет. Если там используется контрол WebBrowser - может лучше посмотреть на реализацию Мозиллы. Он в Моно входит.

Консультировал: Evgenijm
Дата отправки: 18.11.2009, 20:16

5
нет комментария
-----
Дата оценки: 18.11.2009, 21:01

Рейтинг ответа:

НЕ одобряю 0 одобряю!

Консультация # 165201:

Здравствуйте, ув. эксперты.
Вопрос по механизму reflection.

Сразу оговорюсь. Структура задачи не подлежит реформированию. Она должна работать именно в той конструкции, в к. она сейчас построена.

Итак. Имеется контрол на форме (по контролу был мой же вопрос №163879). Из себя он представляет текстовое поле с кнопкой в правом углу. При нажатии на кнопку открывается форма. На данный момент контрол вполне юзабельный. Но он жестко привязан к одному типу формы, к. я заранее знаю. Скажем, тип формы MainForm. И весь обработчик клика на кнопку подвязан к этому типу. Т.е. я привожу к нему и от этого пляшу:

Код :
((MainForm)obj).<необходимые методы и/или свойства>;


Для конкртеного проекта большего и не надо. Но я хочу использовать этот контрол в других своих проектах, а также делиться им с людьми. Поэтому вынес его в отдельный проект и сделал из него dll. Также для полной универсальности было добавлено свойство:
Код :
protected Form bFormValue;

public Form BindForm
{
    get
    {
        return bFormValue;
    }
    set
    {
        if (value.GetType().BaseType != typeof(Form))
        {
            throw new InvalidCastException("Должна быть форма.");
        }
        if (value.GetType().GetMethod("StartValue", BindingFlags.Public | BindingFlags.Instance) == null)
        {
            throw new InvalidCastException("Форма должна иметь реализацию метода:\r\n public void StartValue(string startValue){...}");
        }
         bFormValue = value;
    }
}


При попытке присвоить этому свойству значение конкретной формы (тип которой я уже НЕ знаю), во-первых, происходит проверка, а форма ли это вообще, во-вторых, эта форма должна иметь метод:

Код :
public void StartValue(string sv){}


Для чего это надо? Скорее всего, форма при открытии должна инициализироваться какими-либо стартовыми значениями. Пока что реальная необходимость передавать строку (со временем будет правильнее передавать object). И вот этот метод как раз и будет обработчиком события. Он эту строку примет и сделает с ним все, что пожелает разработчик конкретной формы. Тут, правда, можно было создать конструктор с параметрами. Но это больше похоже на костыль. Плюс это не решает проблемы возможного возврата параметров. Да и вообще обмен сообщенияями между формами.

Для того, ччтобы передать строку в форму, был объявлен делегат:

Код :
public delegate void StartValueEvent(string startValue);


и само событие:

Код :
public event StartValueEvent setStartValue;


Внимание, вопрос. Как теперь подписать форму неизвестного типа на получение этого события? т.е. если бы тип был известен (как у меня сейчас), то это выглядело бы примерно так:
Код :
setStartValue += ((MainForm)BindForm).StartValue;
..
setStartvalue(<строка>);


Но тут вся проблема менно в неизвестности типа формы. Т.е. задача сводится к тому, чтобы подписать внешнюю форму на событие "от себя".

Порылся в МСДН. Нашел похожий пример (в приложении). Правда, этот пример выполняет немного другую задачу - он подписывает себя на событие от внешней формы (он делает еще нечто, но это не по теме). Немного перекроив пример получил следующий код:
Код :
//Assembly assem = Assembly.GetExecutingAssembly();  //Вот такой вариант вообще не может получить отражения формы (почему-то)

//Значит возьмем отражение формы из ядра
string fullName = "";
foreach (Assembly ass in AppDomain.CurrentDomain.GetAssemblies())
{
    if (ass.GetName().Name == "mscorlib")
    {
        fullName = ass.FullName;
        break;
    }
}
Assembly assem = Assembly.LoadFile(Application.ExecutablePath);

//Получим форму
Type tExForm = assem.GetType(BindForm.GetType().FullName);
//Создадим ее отражение (экземпляр)
Object exFormAsObj = Activator.CreateInstance(tExForm);
//Возьмем "у себя" событие (к чему такие сложности мне не понятно, но по-другому не работает)
EventInfo ev = this.GetType().GetEvent("setStartValue");
//и тип делегата этого события
Type tDelegate = ev.EventHandlerType;

//Получим метод у формы, к. будет обрабатывать событие
MethodInfo miHandler = BindForm.GetType().GetMethod("StartValue", BindingFlags.Public | BindingFlags.Instance);

//Теперь собственно, создадим полноценный делегат на обработчик
Delegate d = Delegate.CreateDelegate(tDelegate, BindForm, miHandler);

//А вот проблемный код!!!
//По идее, он должен подписать форму на получение событие
MethodInfo addHandler = ev.GetAddMethod(); //Тут все нормально, получили "что-то", как бы хандлер (обработчик)
Object[] addHandlerArgs = { d }; //Добавили этот обработчик в список параметров
//Сама подписка (чуть ниже)
addHandler.Invoke(exFormAsObj, addHandlerArgs); 


При попытке выполнить метод Invoke генерируется исключение:
Код :
An unhandled exception of type 'System.Reflection.TargetException' occurred in mscorlib.dll

Additional information: Объект не соответствует конечному типу.


Хотя при этом передаваемые параметры не null.

И что делать, не знаю. Нужна помощь.

Всем спасибо.

P.S. Если существует другой способ подписать форму заранее неизвестного типа на событие, то пойдет. Лишь бы это не ломало структуру задачи.
P.S.S. Код подписки происходит в классе-наследнике от UserControl (не Form!!). Возможно, это имеет значение. Хотя, вряд ли, тк.. пример из МСДН работает вообще не формой,а с обычным классом.

Дата отправки: 17.04.2009, 12:40
Вопрос задал: Грибенников Александр Сергееви
Всего ответов: 1
Страница онлайн-консультации »


Консультирует DrakoN:

Здравствуйте, Грибенников Александр Сергееви!
Чесно с трудом понимаю суть проблемы. Но постараюсь кратко обяснить. Если у Вас есть обект Х и есть его наследник ХХ. Знать тип ХХ вам не нужно. Можно реализовать вызов ивента для обекта Х и он будет работать для всех наследников.
Помойму вы просто перемудрили.=)
А) public event delegate_name SomeEvent<CustomEventArgs> где CustomEventArgs - наследник базовго EventArgs. Вот такой ивентик есть у Вас в Юзерконтроле. Теперь вы хотите форму типа Х подписать на этот ивент. Делаем СustomControl форму. Говорим нашему контролы что он должен подписаться на это событие. А все остальные формы наследуем от этой.
Б) Если есть делегат. То его можно заинвоукать. =) Для того чтобы все получилось. У контрола у делегата у ивента и внутреннего обработчика должен быть тип public.

Если этого мало. Опишите четко задачу. Попытаюсь подсказать. Так как я с трудом понимаю. Что вы хотите.

Консультировал: DrakoN
Дата отправки: 17.04.2009, 14:41
Рейтинг ответа:

НЕ одобряю 0 одобряю!

Консультация # 180598:

Здравствуйте, уважаемые эксперты! Помоги, пожалуйста, решить задачу:

Разработать консольную программу на языке C# (Предусмотреть меню, позволяющее проверить все методы класса):

Составить описание класса для определения одномерных массивов целых чисел. Предусмотреть возможность обращения к отдельному элементу массива с контролем выхода за пределы массива, возможность задания произвольных границ индексов при создании объекта, возможность выполнения операций поэлементного сложения и вычитания массивов с одинаковыми границами индексов, умножения и деления всех элементов массива на скаляр, вывода на экран элемента массива по заданному индексу, вывода на экран всего массива, поиска заданного элемента.

Заранее спасибо за ответ!

Дата отправки: 07.11.2010, 13:16
Вопрос задал: verona
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Челноков Виктор Альбертович:

Здравствуйте, verona!
Посмотрите это вариант
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;

namespace массив
{
class Program

{
static string ss;
static int i=0;
static int[] mass1;
static int[] mass2;
static string f = "";
static void Main(string[] args)
{
menu();
Readline( Console.ReadLine());

}

static void Readline(string s)
{
switch (s)
{
case "1":
new_mass();
break ;
case "2":
print_elem();
break ;
case "3":
print_mass();
break ;
case "4":
mass_um_skal();
break ;
case "5":
mass_del_skal();
break ;
case "6":
new_2_mass();
break ;
case "7":
mass_2_plus();
break ;
case "8":
mass_2_minus();
break ;
case "9":
menu();
Readline(Console.ReadLine());
break ;



}

}
static void menu()
{
Console.WriteLine("1- создание массива указанной размерности");
Console.WriteLine("2- вывод на экран элемента массива");
Console.WriteLine("3- вывод на экран массива");
Console.WriteLine("4- вывод на экран массива элементов умноженных на скаляр");
Console.WriteLine("5- вывод на экран массива элементов разделенных на скаляр");
Console.WriteLine("6- создание 2-х массивов указанной размерности");

}
static void menu1()
{
Console.WriteLine("7- поэлементное сложение массивов");
Console.WriteLine("8- поэлементное вычитание массивов");
Console.WriteLine("9- возврат в основное меню");


}
static void new_mass()
{
Console.WriteLine("Введите размер массива");
i = int.Parse(Console.ReadLine());
mass1 = new int[i];
Console.WriteLine("Введите первый элемент");
int ii = 0 ;
f = Console.ReadLine();
while (f != "k")
{ int q = 0;

if (Int32.TryParse(f, NumberStyles.Integer, null, out q) == true)
{

if (ii < i)
{
mass1[ii] = q;
Console.WriteLine("Введите следующий элемент");
ii++;
if (ii < i)
{
f = Console.ReadLine();
}
}
else
{
Console.WriteLine("Достигнут предел индекса массива");
f = "k";
}

}
else
{
Console.WriteLine("Должно быть число ");
f = Console.ReadLine();

}



}
Console.WriteLine("Массив создан");
menu();
Readline(Console.ReadLine());

}
static void print_elem()
{
if (mass1 is int[])
{
Console.WriteLine("Введите индекс нужного элемента по окончании введите k");
int ii = mass1.Length;
f = Console.ReadLine();

while (f != "k")
{
int q = 0;

if (Int32.TryParse(f, NumberStyles.Integer, null, out q) == true)
{

if (q < i)
{
int qq = mass1[q];

Console.WriteLine("Индекс элемента - " + q + " элемент - " + qq);
Console.WriteLine("Введите следующий индекс массива");

f = Console.ReadLine();

}
else
{
Console.WriteLine("Значение индекса за пределами массива");
Console.WriteLine("Введите следующий индекс массива");

f = Console.ReadLine();

}

}
else
{
Console.WriteLine("Должно быть число ");
f = Console.ReadLine();

}



}
menu();
Readline(Console.ReadLine());
}
else
{
Console.WriteLine("Создайте массив");
menu();
Readline(Console.ReadLine());

}


}
static void print_mass()
{
if (mass1 is int[])
{
for (int ii = 0; ii < i; ii++)
{
int q=mass1[ii];
Console.WriteLine("Индекс элемента - " + ii + " элемент - " + q);

}

}
else
{
Console.WriteLine("Создайте массив");
menu();
Readline(Console.ReadLine());

}
menu();
Readline(Console.ReadLine());


}
static void mass_um_skal()
{

if (mass1 is int[])
{
Console.WriteLine("Введите число на какое надо умно жить элементы массива ");
f = Console.ReadLine();
int q = 0;
if (Int32.TryParse(f, NumberStyles.Integer, null, out q) == true)
{

for (int ii = 0; ii < i; ii++)
{
int qq = mass1[ii]*q;
Console.WriteLine("Индекс элемента - " + ii + " элемент - " + qq);

}
}
else
{
Console.WriteLine("Должно быть число ");
f = Console.ReadLine();
}


}
else
{
Console.WriteLine("Создайте массив");
menu();
Readline(Console.ReadLine());

}
menu();
Readline(Console.ReadLine()) ;

}
static void mass_del_skal()
{

if (mass1 is int[])
{
Console.WriteLine("Введите число на какое надо разделить элементы массива ");
f = Console.ReadLine();
int q = 0;
if (Int32.TryParse(f, NumberStyles.Integer, null, out q) == true)
{

for (int ii = 0; ii < i; ii++)
{
int qq = mass1[ii] / q;
Console.WriteLine("Индекс элемента - " + ii + " элемент - " + qq);

}
}
else
{
Console.WriteLine("Должно быть число ");
f = Console.ReadLine();
}


}
else
{
Conso le.WriteLine("Создайте массив");
menu();
Readline(Console.ReadLine());

}
menu();
Readline(Console.ReadLine());

}
static void new_2_mass()
{
Console.WriteLine("Введите размер первого массива ");
i = int.Parse(Console.ReadLine());
mass1 = new int[i];
new_mass2(mass1 );
Console.WriteLine("Введите размер второго массива ");
i = int.Parse(Console.ReadLine());
mass2 = new int[i];
new_mass2(mass2 );
menu1();
Readline(Console.ReadLine());
}
static void new_mass2(int[] mas)
{

Console.WriteLine("Введите первый элемент");
int ii = 0;
f = Console.ReadLine();
while (f != & quot;k")
{
int q = 0;

if (Int32.TryParse(f, NumberStyles.Integer, null, out q) == true)
{

if (ii < i)
{
mas[ii] = q;
ii++;
if (ii < i)
{
Console.WriteLine("Введите следующий элемент");
f = Console.ReadLine();
}
}
else
{
Console.WriteLine("Достигнут предел индекса массива");
f = "k";
}

}
else
{
Console.WriteLine("Должно быть число ");
f = Console.ReadLine();

}



}
Console.WriteLine("Массив создан");

}

static void mass_2_plus()
{
if (mass1 is int[]&& mass2 is int[] && mass1.Length == mass2.Length )
{

int q = 0;

for (int ii = 0; ii < i; ii++)
{
int qq = mass1[ii] + mass2[ii];
Console.WriteLine("Индекс элемента - " + ii + " элемент - " + qq);

}


}
else
{
Console.WriteLine("Создайте массивы или у массивов разные размеры");
menu();
Readline(Console.ReadLine());

}
menu1();
Readline(Console.ReadLine());
}

static void mass_2_minus()
{
if (mass1 is int[] && mass2 is int[] && mass1.Length == mass2.Length)
{

int q = 0;

for (int ii = 0; ii < i; ii++)
{
int qq = mass1[ii] - mass2[ii];
Console.WriteLine("Индекс элемента - " + ii + " элемент - " + qq);

}


}
else
{
Console.WriteLine("Создайте массивы или у массивов разные размеры");
menu();
Readline(Console.ReadLine());

}
menu1();
Readline(Console.ReadLine());
}
}


}

Консультировал: Челноков Виктор Альбертович
Дата отправки: 08.11.2010, 12:09

5
нет комментария
-----
Дата оценки: 11.11.2010, 18:20

Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка  |  восстановить логин/пароль

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!


В избранное