Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Веселая фича

565  1 2 3 все
AlexNek патриот16.01.13 23:01
AlexNek
NEW 16.01.13 23:01 
в ответ Murr 16.01.13 20:29
В ответ на:
TTemplatesDll представляет единственную длл в системе

А с каких пор ДЛЛ стала синглтоном? Я что то пропустил?
#21 
Murr патриот17.01.13 00:51
Murr
NEW 17.01.13 00:51 
в ответ AlexNek 16.01.13 23:01
Представление Длл, однако, будет именно синглетоном... Ну не грузит же приложение две Длл... Хотя... Linq, похоже, грузит...
Да, вопросик попутnый образовался - загрузить Длл разными способами Я вроде умею... интересует - Как загрузить единичный класс из Длл?!.
#22 
  Posmotrim завсегдатай17.01.13 10:11
Posmotrim
NEW 17.01.13 10:11 
в ответ Murr 17.01.13 00:51
Смешались вместе кони, люди... :)))
#23 
Murr патриот17.01.13 10:38
Murr
NEW 17.01.13 10:38 
в ответ Posmotrim 16.01.13 18:11
И так - код
[пре]
public class TTemplatesDll
{
string templateDir;
private TTemplatesDll()
{
}
private static TTemplatesDll instance;
public static TTemplatesDll Instance
{
get
{
if (instance == null)
{
instance = new TTemplatesDll();
instance.filename = defaultDllName;
}
return instance;
}
}
public static string TemplateDir
{
set
{
Instance.templateDir = value;
new TModules(value);
logger.Debug("TemplatesDir seted as " + value);
}
get
{
if (Instance.templateDir == null || Instance.templateDir == string.Empty)
{
throw new Exception("Pointer to Template's directory not initialized");
}
return Instance.templateDir;
}
}
}
public class TModules : List<TAbc>
{
private static string DefaultCstFolder = TTemplatesDll.TemplateDir;
public TModules(string pTemplatesDir)
{
/// обрезано
}
public int Remove() // падает с Ехцептионом на вызове этого метода. Сам метод - не выполняется.
{
return base.RemoveAll(x => !x.Exists());
}
}
public class TAbc
{
public bool Exsist() { ... }
}
[/пре]
#24 
  Posmotrim завсегдатай17.01.13 11:13
Posmotrim
NEW 17.01.13 11:13 
в ответ Murr 17.01.13 10:38
линком то тут как раз и не пахнет.
#25 
Murr патриот17.01.13 12:35
Murr
NEW 17.01.13 12:35 
в ответ Posmotrim 17.01.13 11:13
RemoveAll(x => !x.Exists());
#26 
  Posmotrim завсегдатай17.01.13 13:00
Posmotrim
NEW 17.01.13 13:00 
в ответ Murr 17.01.13 12:35
В ответ на:
RemoveAll(x => !x.Exists());

это не линк. RemoveAll - метод коллекции, принимающий предикат. в качестве предиката передана лямбда. так что одно уже выяснили на 100%: линк тут не причём. уже хорошо.
теперь давай перейдём к:
В ответ на:
// падает с Ехцептионом на вызове этого метода. Сам метод - не выполняется.

кашпировских тут нет :) так что давай чуть подробней: какой исключение? Тип, сообщение, стэктрейс.
#27 
Murr патриот17.01.13 14:47
Murr
NEW 17.01.13 14:47 
в ответ Posmotrim 17.01.13 13:00
какой исключение?
---
В коде только одно исключение. Именно оно и выбрасывается...
принимающий предикат.
-----
Ну а предикат-то как вычисляется?
#28 
  Posmotrim завсегдатай17.01.13 15:30
Posmotrim
NEW 17.01.13 15:30 
в ответ Murr 17.01.13 14:47
тебе вопросы задавать - ацкая пытка :) или ты просто издеваешься? :)
В ответ на:
В коде только одно исключение. Именно оно и выбрасывается...

тоесть кидается
new Exception("Pointer to Template's directory not initialized");

из геттера. так? ты ответил на 2/3 моего первого вопроса. приведи стэк-трейс, будь добр =)

В ответ на:
Ну а предикат-то как вычисляется?

Еще раз : лямбда-выражение представляет краткий способ создания предикатов и не имеет ничего общего с линк. :)
#29 
Murr патриот17.01.13 16:06
Murr
NEW 17.01.13 16:06 
в ответ Posmotrim 17.01.13 15:30
приведи стэк-трейс, будь добр =)
------
Чтобы это сделать надо открутить код на три-четыре дня назад. Даже если он и сохранился где-то - это туда-сюда положительного для задачи не даст, а времени займет много... Лучше Я поборюсь с Нулл-поинтером из-за недостатка памяти...
тебе вопросы задавать - ацкая пытка :)
-----
Так скопы-пасть код - он упадет и вопросов не будет...
#30 
  Posmotrim завсегдатай17.01.13 16:09
Posmotrim
NEW 17.01.13 16:09 
в ответ Murr 17.01.13 16:06, Последний раз изменено 17.01.13 16:15 (Posmotrim)
В ответ на:
Так скопы-пасть код - он упадет и вопросов не будет...

так приведи минимальный код, который я смогу скомпилировать.
давай я тебе помогу:
using System;
using System.Collections.Generic;
namespace ConsoleApplication18
{
public class TTemplatesDll
{
string templateDir;
private TTemplatesDll()
{
}
private static TTemplatesDll instance;
public static TTemplatesDll Instance
{
get
{
if (instance == null)
{
instance = new TTemplatesDll();
instance.templateDir = "uhhaha!!!";
}
return instance;
}
}
public static string TemplateDir
{
set
{
Instance.templateDir = value;
new TModules(value);
System.Diagnostics.Debug.WriteLine("TemplatesDir seted as " + value);
}
get
{
if (Instance.templateDir == null || Instance.templateDir == string.Empty)
{
throw new Exception("Pointer to Template's directory not initialized");
}
return Instance.templateDir;
}
}
}
public class TModules : List<TAbc>
{
private static string DefaultCstFolder = TTemplatesDll.TemplateDir;
public TModules(string pTemplatesDir)
{
/// обрезано
}
public int Remove() // падает с Ехцептионом на вызове этого метода. Сам метод - не выполняется.
{
return base.RemoveAll(x => !x.Exists());
}
}
public class TAbc
{
public bool Exists()
{
return true;
}
}
class Program
{
static void Main(string[] args)
{
System.Console.WriteLine(TTemplatesDll.TemplateDir);
}
}
}


вывод:

uhhaha!!!
Drücken Sie eine beliebige Taste . . .


#31 
AlexNek патриот17.01.13 19:28
AlexNek
NEW 17.01.13 19:28 
в ответ Murr 17.01.13 00:51
В ответ на:
Представление Длл, однако, будет именно синглетоном

В первый раз встречаю, такое определение
Как то привык ориентироваться на другое.
http://csharpindepth.com/articles/general/singleton.aspx
http://msdn.microsoft.com/en-us/library/ff650316.aspx
В ответ на:
интересует - Как загрузить единичный класс из Длл

Для каких целей, можно уточнить?
А в общем прицип простой - грузим длл-ку и вытаскиваем нужный тип
Assembly SampleAssembly;
SampleAssembly = Assembly.LoadFrom("c:\\Sample.Assembly.dll");
SampleAssembly.GetType("SuperPuperType",true);
Однако веселые часы получишь после :)
Весьма желательно грузить все требуемые Длл-ки в домейн приложения (все выбирается автоматом). Иначе рискуешь получить две копии какой нибудь длл-ки и после долго думать отчего "type1" != "type1"
Ну и в домейне также неплохо подписаться на ошибки загрузки длл-ок и типов.
#32 
Murr патриот17.01.13 20:38
Murr
NEW 17.01.13 20:38 
в ответ AlexNek 17.01.13 19:28
СамплеАссемблы = Ассемблы.ЛоадФром("ц:\\Сампле.Ассемблы.длл");
------
Это - легко...
Даже класс из нее инстанцировать никакой сложности не представляет... это, кстати, именно тот класс который мне нужен...
Теперь , плс, перекомпилируй те из 650 шаблонов, которые требуют перекомпиляции... информация - аккурат в загруженном классе...
Первый момент - файл не доступен для записи... Хорошо - грузим в массив и инстанцируем и массива... Победили... однако памяти отожрали много...
Можно уменьшить расходы, сохраняя нужный мне класс в отдельной Длл... тоже работает... но получается много Дллок.
Хочется, однако, иметь одну (большую) Длл и не загружать ее несколько раз...
Потому спрашиваю - Как загрузить отдельный класс из Длл, не загружая саму Длл.
Что-то вида - прочитать заголовок, прочитатй кусок байтового аррея представляющий нужный мне класс и инстанцировать только этот класс из аррея...
и после долго думать отчего "тыпе1" != "тыпе1"
------
Похоже, что что-то похожее было...
#33 
Murr патриот17.01.13 20:44
Murr
NEW 17.01.13 20:44 
в ответ Posmotrim 17.01.13 16:09
Хммм... В немецком Я понимаю меньше чем свинья в апельсинах...
Говоришь - не падает... Ну пусть так... А у меня - упало... где не ожидал...
Отчего и почему - не знаю... и не интересно...
Сделал чтобы работало - и хорошо - там других проблем навалом...
#34 
  Posmotrim завсегдатай17.01.13 21:03
Posmotrim
NEW 17.01.13 21:03 
в ответ Murr 17.01.13 20:44
да причём там немецкий... это вывод программы на консоль..
ладно, работает и ладно.
#35 
AlexNek патриот17.01.13 21:10
AlexNek
NEW 17.01.13 21:10 
в ответ Murr 17.01.13 20:38
Пока еще смутно пониманию что тебе нужно. Чем тебя смущает Лоад?
Можно еще поиграться
с Assembly.ReflectionOnlyLoad и AppDomain
Или загрузить кучу твоих мелких дллок в ресурсы, а после грузить оттуда через стреам.
#36 
Murr патриот17.01.13 21:32
Murr
NEW 17.01.13 21:32 
в ответ AlexNek 17.01.13 21:10
Пока еще смутно пониманию что тебе нужно.
------
Мне нужно получить из Длл информацию об тех шаблонах, которые она уже содержит.
После получения этой информации мне нужно добавить/удалить/заменить соответственно новые/удаленные/изненные шаблоны и обновленную информацию обратно в Длл..
Полную перекомпиляцию делать нежелательно - занимает слишком долго, а меняются обычно 1-2-3 шаблона за раз...
Ну а потом - загружать и гнать все на выполнение... Выполнялку Я сегодня дочинил... Осталось немного потоптаться на базовом коде шаблона и почистить все изделие... Баги там, конечно, еще есть, но оно уже супортабельное - понятно где ковырять при падении...
#37 
Murr патриот17.01.13 21:51
Murr
NEW 17.01.13 21:51 
в ответ Posmotrim 17.01.13 21:03
это вывод программы на консоль..
-----
Ааа... не обратил внимания на код...
За попутку разобраться - отдельное спасибо...
Сегодня была другая хохмочка...
Система - запускается... и работает... генерация кода - происходит... 100... 200... 400... 600... шаблонов отработали...
А потом - хлюп... и нулл-поинтер... причем шаблоны - те же самые... и выполнялка - та же самая...
Минут 15 не мог понять откуда проблема - все исходники доступны, все компилируется... хоть инкрементно, хоть с нуля...
И все одно - падает...
Потом догадался - версия шаблонов была от предыдущей генерации - изменений в них не было и их не перекомпилировало,
а изменения у меня были аккурат в базовом коде шаблонов...
#38 
AlexNek патриот17.01.13 21:59
AlexNek
NEW 17.01.13 21:59 
в ответ Murr 17.01.13 21:32
Ну вот, после пыток стало немного проясняться.
В ответ на:
занимает слишком долго

долго это сколько на современном компе?
То бишь шаблоны это некие классы, а не спец. язык?
Какой "уровень наследования"? Что мешает сделать по шаблону на Длл-ку - только количество?
#39 
Murr патриот17.01.13 22:30
Murr
NEW 17.01.13 22:30 
в ответ AlexNek 17.01.13 21:59
долго это сколько на современном компе?
-----
Долго - это дольше, чем может вытерпеть мой шеф...
А вытерпеть он может перекомпиляцию именно тех шаблонов, которые были изменены...
По поводу долго... иногда - долго... есть шаблон, содержащий минимизированную версию какой-то JS-либы... кажется 220 килобайт... минут пять идет конвертация в cs-класс...
Так и хочется выкинуть эту каку хотя бы в отдельный поток... но компилятор - однопоточный...
То бишь шаблоны это некие классы, а не спец. язык?
-----
Отдельный язык, компилируемый (своим компиляторм) в стандартные C# классы. Затем классы уже компилятся в модули... и по результатам еще и Длл лепится...
Какой "уровень наследования"?
-----
2-3... может и больше - я до конца еще не разобрался...
Что мешает сделать по шаблону на Длл-ку - только количество?
-----
Там есть неприятная зависимость от последовательности компиляции... Сейчас шаблоны группируются по модулям и система управляет порядком компиляции и выполнения этих групп/модулей... Если поменять порядок - может и не компилироваться... Разбираться с этим на уровне отдельного шаблона - редактировать в ручную файл в 600+ строк... и делать это каждый раз при добавлении нового шаблона... по 8-10 раз в день... и синхорнизация между разработчиками...
#40 
1 2 3 все