Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Reflection.Assembly блокирует файл. / 21 сообщений из 21, страница 1 из 1
06.11.2015, 19:25
    #39096954
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Reflection.Assembly блокирует файл.
Код: vbnet
1.
2.
Dim asm = Reflection.Assembly.LoadFrom(sFilePath)
asm = Nothing

И всё, sFilePath перезаписать нельзя пока процесс не будет прибит.
Как обойти?
...
Рейтинг: 0 / 0
06.11.2015, 19:42
    #39096966
Axeleron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Reflection.Assembly блокирует файл.
Antonariy,
Использовать AppDomain и при создании AppDomain и выставлять AppDomainSetup.ShadowCopyFiles в true пробовал?
...
Рейтинг: 0 / 0
06.11.2015, 21:06
    #39097029
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Reflection.Assembly блокирует файл.
Нет. Где есть пример этого колдунства?
...
Рейтинг: 0 / 0
06.11.2015, 21:25
    #39097041
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Reflection.Assembly блокирует файл.
Axeleron,

по сути, он загрузит сборку, но как он её выгрузит и загрузит по новой?
файл то можно будет перезаписать, а толку то
...
Рейтинг: 0 / 0
06.11.2015, 22:27
    #39097066
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Reflection.Assembly блокирует файл.
Чтобы было понятно, что происходит: файл блокируется студией посредством расширения, которое копается в его объектной модели. А разблокироваться он должен для того, чтобы студия смогла его перекомпилировать.
...
Рейтинг: 0 / 0
07.11.2015, 07:25
    #39097132
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Reflection.Assembly блокирует файл.
AntonariyЧтобы было понятно, что происходит: файл блокируется студией посредством расширения, которое копается в его объектной модели. А разблокироваться он должен для того, чтобы студия смогла его перекомпилировать.Знаю решение для T4 Text Template. Надо?

Код: c#
1.
<#@ CleanupBehavior processor="T4VSHost" CleanupAfterProcessingtemplate="true" #>
...
Рейтинг: 0 / 0
07.11.2015, 07:37
    #39097133
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Reflection.Assembly блокирует файл.
AntonariyЧтобы было понятно, что происходит: файл блокируется студией посредством расширения, которое копается в его объектной модели . А разблокироваться он должен для того, чтобы студия смогла его перекомпилировать.Немного расстрою. Если копаешься в сборке рефлекшеном, то просто так загрузить сборку в отдельный домен, для его последующей выгрузки, не получится.

Код, анализирующий модель сборки, так же должен быть загружен в выгружаемый домен. Тогда этот код можно будет вызвать методом AppDomain.CreateInstanceAndUnwrap, после чего выгрузить домен.
...
Рейтинг: 0 / 0
07.11.2015, 10:32
    #39097157
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Reflection.Assembly блокирует файл.
Тогда пойдем другим путём
Код: vbnet
1.
2.
Dim b() As Byte = My.Computer.FileSystem.ReadAllBytes(sFiles(0))
asm = Reflection.Assembly.Load(b)

Сборка загружается, но обращение к объектной модели завершается ошибкой FileNotFoundException - не может найти зависимости, а ищет здесь:

Код: plaintext
Журнал: Appbase = file:///D:/ProgramFiles/VS2015/Common7/IDE/

Возможно ли этот путь подменить?
...
Рейтинг: 0 / 0
07.11.2015, 12:16
    #39097184
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Reflection.Assembly блокирует файл.
AntonariyТогда пойдем другим путём
Код: vbnet
1.
2.
Dim b() As Byte = My.Computer.FileSystem.ReadAllBytes(sFiles(0))
asm = Reflection.Assembly.Load(b)

Сборка загружается, но обращение к объектной модели завершается ошибкой FileNotFoundException - не может найти зависимости, а ищет здесь:

Код: plaintext
Журнал: Appbase = file:///D:/ProgramFiles/VS2015/Common7/IDE/

Возможно ли этот путь подменить?Он не может найти зависимые сборки. Может это как-то и можно организовать, но на мой взгляд проще как-то так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
// AssemblyAnalyser.dll

public class AssemblyData
{
    public string[] Types;
}

public class AssemblyAnalyser
{
    public AssemblyData GetData(string assemblyName)
    {
        return new AssemblyData
        {
            Types = Assembly.LoadFrom(assemblyName).GetTypes().Select(t => t.FullName).ToArray();
        };
    }
}


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
// MainProject.exe

var d = AppDomain.Create("Analyser");
try
{
    var aa = (AssemblyAnalyser)d.CreateInstanceAndUnwrap("AssemblyAnalyser", "AssemblyAnalyser.AssemblyAnalyser");
    var data = aa.GetData("MyAnalisingAssembly");

    File.Delete("MyAnalisingAssembly.dll");
}
finally
{
    AppDomain.Unload(d);
}


Возможны ошибки, рассматривай это как концепт. Отпиши потом работает или нет, мне тоже интересно. :-)
...
Рейтинг: 0 / 0
07.11.2015, 12:18
    #39097185
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Reflection.Assembly блокирует файл.
зы: Конечно же File.Delete("MyAnalisingAssembly.dll") разместить после AppDomain.Unload(d)
...
Рейтинг: 0 / 0
07.11.2015, 21:24
    #39097382
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Reflection.Assembly блокирует файл.
Такой вариант ближе к истине, но последняя строчка завершается ошибкой:
Код: vbnet
1.
2.
3.
4.
5.
            sPath = Reflection.Assembly.GetExecutingAssembly.Location
            sPath = Mid(sPath, 1, InStrRev(sPath, "\"))
            Dim d = AppDomain.CreateDomain("Analyser", Nothing, New AppDomainSetup With {.ApplicationBase = sPath})
            Try
                Dim aa = d.CreateInstanceAndUnwrap("AssemblyLoader, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0daea82d6110b4cf", "AssemblyLoader.AssemblyAnalyser")


Тип "AssemblyLoader.AssemblyAnalyser" сборки "AssemblyLoader, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0daea82d6110b4cf" не помечен как сериализуемый.
...
Рейтинг: 0 / 0
07.11.2015, 21:38
    #39097389
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Reflection.Assembly блокирует файл.
Пометил как <Serializable>, раз уж настаивает.

Код: vbnet
1.
2.
3.
4.
5.
6.
<Serializable>
Public Class AssemblyAnalyser
    Public Function GetAssembly(sPath As String) As Reflection.Assembly
        Return Reflection.Assembly.LoadFrom(sPath)
    End Function
End Class

получил:

Не разрешен тип члена "AssemblyLoader.AssemblyAnalyser,AssemblyLoader, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0daea82d6110b4cf".
...
Рейтинг: 0 / 0
08.11.2015, 01:45
    #39097459
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Reflection.Assembly блокирует файл.
Победил. Помогло это:

Код: vbnet
1.
2.
Public Class AssemblyAnalyser
    Inherits MarshalByRefObject

и статья: http://weblog.west-wind.com/posts/2009/Jan/19/Assembly-Loading-across-AppDomains
На ее основании слепил дополнительный класс:

Код: 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.
33.
34.
35.
36.
37.
38.
39.
40.
41.
<ClassInterface(ClassInterfaceType.AutoDual)>
Public Class AAFactory
    Inherits MarshalByRefObject

    Dim LocalAppDomain As AppDomain = Nothing
    Dim ResolvePath As String
    Dim WithEvents rslv As AppDomain

    Public Sub New(sResolvePath As String)
        ResolvePath = sResolvePath
    End Sub

    Public Function CreateAssemblyAnalyser() As AssemblyAnalyser
        Me.CreateAppDomain(Nothing)
        Dim AssemblyPath As String = Assembly.GetExecutingAssembly().Location
        Return DirectCast(Me.LocalAppDomain.CreateInstanceFrom(AssemblyPath, GetType(AssemblyAnalyser).FullName).Unwrap(), AssemblyAnalyser)
    End Function

    Private Function CreateAppDomain(appDomain__1 As String) As Boolean
        If String.IsNullOrEmpty(appDomain__1) Then appDomain__1 = "wsdlparser" + Guid.NewGuid().ToString().GetHashCode().ToString("x")
        Me.LocalAppDomain = AppDomain.CreateDomain(appDomain__1, Nothing, New AppDomainSetup With {.ApplicationBase = Environment.CurrentDirectory})
        rslv = AppDomain.CurrentDomain
        Return True
    End Function

    Private Function rslv_AssemblyResolve(sender As Object, args As ResolveEventArgs) As Assembly Handles rslv.AssemblyResolve
        If args.Name = Assembly.GetExecutingAssembly.FullName Then
            Return Assembly.Load(args.Name)
        Else
            Return Assembly.LoadFrom(Regex.Replace(args.Name, "^([^,]+),.*", ResolvePath + "\$1.dll"))
        End If
    End Function

    Public Sub Unload()
        rslv = Nothing
        If Me.LocalAppDomain IsNot Nothing Then
            AppDomain.Unload(Me.LocalAppDomain)
            Me.LocalAppDomain = Nothing
        End If
    End Sub
End Class

использование:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
            Dim aaf As New AssemblyLoader.AAFactory(sPath) 'папка, где лежит сборка
            Try
                Dim aa As AssemblyLoader.AssemblyAnalyser = aaf.CreateAssemblyAnalyser
                Dim asm As Reflection.Assembly = aa.GetAssembly(sFiles(0))
                'мучаем сборку
            Catch ex As Exception
                
            Finally
                aaf.Unload()
            End Try
            aaf = Nothing
            'сборка свободна 
...
Рейтинг: 0 / 0
09.11.2015, 16:47
    #39098642
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Reflection.Assembly блокирует файл.
Не совсем победил. При отдаче ссылки на Reflection.Assembly за пределы домена, в котором сборка создается, она загружается и в вызывающий домен, то есть домен студии. Придется всю обработку сборки в AssemblyAnalyser перетаскивать.
...
Рейтинг: 0 / 0
10.11.2015, 04:56
    #39099082
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Reflection.Assembly блокирует файл.
AntonariyПридется всю обработку сборки в AssemblyAnalyser перетаскивать.Ну да, ради этого и предложена сборка AssemblyAnalyser.dll, возвращающая модель независимую от классов рефлекшена.
...
Рейтинг: 0 / 0
10.11.2015, 10:37
    #39099275
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Reflection.Assembly блокирует файл.
Алексей КAntonariyПридется всю обработку сборки в AssemblyAnalyser перетаскивать.Ну да, ради этого и предложена сборка AssemblyAnalyser.dll, возвращающая модель независимую от классов рефлекшена.Отдельная сборка не нужна, достаточно классов AssemblyAnalyser и AssemblyData, но AssemblyData должен быть сериализуемым (или возможно тоже наследоваться от MarshalByRefObject, уже лень проверять). AssemblyAnalyser инкапсулирует работу с Reflection и типами тех сборок, которые должны быть выгружены, создается в отдельном домене, и этого достаточно.
...
Рейтинг: 0 / 0
10.11.2015, 11:01
    #39099308
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Reflection.Assembly блокирует файл.
AntonariyАлексей Кпропущено...
Ну да, ради этого и предложена сборка AssemblyAnalyser.dll, возвращающая модель независимую от классов рефлекшена.Отдельная сборка не нужна, достаточно классов AssemblyAnalyser и AssemblyData, но AssemblyData должен быть сериализуемым (или возможно тоже наследоваться от MarshalByRefObject, уже лень проверять). AssemblyAnalyser инкапсулирует работу с Reflection и типами тех сборок, которые должны быть выгружены, создается в отдельном домене, и этого достаточно.Ну это чтобы во второй домен не загружалось ничего лишнего. Может это "экономия на спичках", спорить не буду. :-)
...
Рейтинг: 0 / 0
10.11.2015, 15:14
    #39099666
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Reflection.Assembly блокирует файл.
При компиляции выхватил ошибку, что заблокирован pdb-файл, перезаписать невозможно. Повторить не получилось.
По-моему студия надо мной издевается.
...
Рейтинг: 0 / 0
10.11.2015, 18:23
    #39099945
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Reflection.Assembly блокирует файл.
Теперь не получается повторить ситуацию, чтобы все работало. Даже откатился к варианту с AssemblyAnalyser в отдельной сборке, гадский pdb блокируется и всё.
авторНе удалось скопировать "obj\Debug\PMan.pdb" в "bin\PMan.pdb"
...
Рейтинг: 0 / 0
11.11.2015, 09:42
    #39100257
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Reflection.Assembly блокирует файл.
Ещё можно исходники парсить а не по скомпилированным сборкам лазить.

Roslyn
...
Рейтинг: 0 / 0
11.11.2015, 10:50
    #39100356
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Reflection.Assembly блокирует файл.
Алексей КЕщё можно исходники парситьЯ начал с парсинга объектной модели солюшена, в ней тоже есть вся необходимая инфа. В 12й студии все работало, в 13й все работало, а в 15 фигакс, и эти уроды изменили объектную модель, а интероп devenv (объектная модель студии на com) превратили в полное говно, описывающее дай бог половину com-модели devenv, из-за чего я так и не нашел пропавших свойств. Пришлось перебираться на Reflection.

Осваивать новую монструозную объектную модель, большая часть которой мне не нужна? Ну уж дудки, пока потерплю, а потом домучаю освобождение файлов. А может в сервис-паке devenv приведут в божеский вид.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Reflection.Assembly блокирует файл. / 21 сообщений из 21, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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