|
Не освобождается DLL после AppDomain.Unload()
|
|||
---|---|---|---|
#18+
Пытаюсь выполнить метод из 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.
Но File.Delete(tmpDllName) в конце не работает, т.к. файл занят. Как освободить файл (или, ещё лучше бы - как выполнить DLL в памяти, не используя этот файл, но только так, чтобы потом её выгрузить) ? Или, может даже не DLL, а просто метод, скомпилированный каким-то образом в процессе выполнения из строки? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2015, 17:11 |
|
Не освобождается DLL после AppDomain.Unload()
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2015, 17:46 |
|
Не освобождается DLL после AppDomain.Unload()
|
|||
---|---|---|---|
#18+
Код: c# 1.
В этот момент сборка TestNameSpace подгружается в основной домен. Нельзя выпускать объекты Reflection за пределы домена. Марк333а просто метод, скомпилированный каким-то образом в процессе выполнения из строки?да. не указывать OutputAssembly :) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2015, 17:57 |
|
Не освобождается DLL после AppDomain.Unload()
|
|||
---|---|---|---|
#18+
Antonariyда. не указывать OutputAssembly :)файл все равно будет создан на диске, но fw знает в каком месте, и со временем он будет подчищен самой системой. можно не париться с аппдоменами, я когда-то юзал такой код, с трудом его нашел: Код: vbnet 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2015, 18:02 |
|
Не освобождается DLL после AppDomain.Unload()
|
|||
---|---|---|---|
#18+
Хм... Эту ссылку я почитал, кое-что полезное почерпнул. Но вот это AntonariyНе совсем победил. При отдаче ссылки на Reflection.Assembly за пределы домена, в котором сборка создается, она загружается и в вызывающий домен, то есть домен студии. Придется всю обработку сборки в AssemblyAnalyser перетаскивать.совсем не радует... В моём примере метод, который ничего не принимает и ничего не возвращает. Но хотелось бы уметь и вернуть что-нибудь оттуда... ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2015, 18:02 |
|
Не освобождается DLL после AppDomain.Unload()
|
|||
---|---|---|---|
#18+
Марк333В моём примере метод, который ничего не принимает и ничего не возвращает. Но хотелось бы уметь и вернуть что-нибудь оттуда...для этого создается класс, экземпляр которого создается в отдельном домене, он работает с Reflection и возвращает результат в основной домен. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2015, 18:06 |
|
Не освобождается DLL после AppDomain.Unload()
|
|||
---|---|---|---|
#18+
AntonariyМарк333а просто метод, скомпилированный каким-то образом в процессе выполнения из строки?да. не указывать OutputAssembly :) Если я комментирую строчку //OutputAssembly = tmpDllName, то получаю примерно вот такую ошибку: Не удалось загрузить файл или сборку "jadotpmm, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" либо одну из их зависимостей. Не удается найти указанный файл. т.е. он всё равно хочет какой-то файл. Хотя, если делать в основном домене - да, нормально можно загрузить такую сборку. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2015, 18:11 |
|
Не освобождается DLL после AppDomain.Unload()
|
|||
---|---|---|---|
#18+
Марк333т.е. он всё равно хочет какой-то файл. Хотя, если делать в основном домене - да, нормально можно загрузить такую сборку.ну и загружай в основной домен. новый файл в той же сессии будет создан с новым случайным именем, а уборка мусора больше не твоя задача. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2015, 18:35 |
|
Не освобождается DLL после AppDomain.Unload()
|
|||
---|---|---|---|
#18+
Antonariyну и загружай в основной домен. новый файл в той же сессии будет создан с новым случайным именем, а уборка мусора больше не твоя задача. Так-то оно так. Дисковый мусор когда-нибудь удалится. Но ведь тогда из памяти я это дело выгрузить не смогу, пока не завершён процесс. И если таких динамических компиляций много (скажем, берём из БД какую-то формулу, выполняем по ней расчёты, и так много-много раз, и формул таких много на разные случаи, а редактирует их юзер), это ведь каждый раз новая сборка, загружаемая в память навсегда. Конечно, памяти на компах нынче много (что и развращает), но сам подход как-то не очень мне нравится... Даже если создавать из этого делегатов и кэшировать их, а потом использовать, таская из кэша и создавая только ранее не используемые, всё равно как-то не то... ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2015, 21:04 |
|
Не освобождается DLL после AppDomain.Unload()
|
|||
---|---|---|---|
#18+
Марк333Antonariyну и загружай в основной домен. новый файл в той же сессии будет создан с новым случайным именем, а уборка мусора больше не твоя задача. Так-то оно так. Дисковый мусор когда-нибудь удалится. Но ведь тогда из памяти я это дело выгрузить не смогу, пока не завершён процесс. И если таких динамических компиляций много (скажем, берём из БД какую-то формулу, выполняем по ней расчёты, и так много-много раз, и формул таких много на разные случаи, а редактирует их юзер), это ведь каждый раз новая сборка, загружаемая в память навсегда. Конечно, памяти на компах нынче много (что и развращает), но сам подход как-то не очень мне нравится... Даже если создавать из этого делегатов и кэшировать их, а потом использовать, таская из кэша и создавая только ранее не используемые, всё равно как-то не то...ну ты же не сказал сразу, что твой процесс будет работать постоянно, до последнего этот сюрприз берег. значит выносить работу с Reflection в отдельный класс и создавать его в отдельном домене. есть еще вариант без сборок и компиляции, может тебе его хватит: http://www.codeproject.com/Articles/538920/Dynamic-Expresso ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2015, 23:00 |
|
Не освобождается DLL после AppDomain.Unload()
|
|||
---|---|---|---|
#18+
Спасибо, вот это ближе к тому, что я искал. Попробую. А я уже нашёл и опробовал несколько другой вариант: http://www.codeproject.com/Articles/46350/Evaluate-Expressions-from-C-using-JavaScript-s-Eva Это небольшой отход от c# (крохотная функция на java), но мне-то какая разница - всё равно код для .net получается. "По мотивам" этого написал вот такой батник: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
получаю им DLL, подключаю к проекту, и юзаю метод Eval, который есть обёртка над java - функцией eval(). Понятно, что для конкретных целей можно сколь угодно усложнить. Благо, тут есть with, так что не придётся писать в выражениях "Math.Sin(x)..." к примеру, а можно просто "Sin(x)" и т.д. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2015, 08:22 |
|
Не освобождается DLL после AppDomain.Unload()
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2015, 10:46 |
|
Не освобождается DLL после AppDomain.Unload()
|
|||
---|---|---|---|
#18+
колеса покруглее https://www.simple-talk.com/dotnet/.net-framework/dynamic-language-integration-in-a-c-world/, http://jint.codeplex.com/documentation, c IronRuby таже история... Ну и искать... Незабвенный МСУ что-то в свои рецепты положил http://codearticles.ru/articles/537 ... Еще что-то было, но я туп и не нашел... ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2015, 11:10 |
|
|
start [/forum/topic.php?fid=20&fpage=73&tid=1401067]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
30ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
others: | 337ms |
total: | 461ms |
0 / 0 |