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

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

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

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

Код, анализирующий модель сборки, так же должен быть загружен в выгружаемый домен. Тогда этот код можно будет вызвать методом AppDomain.CreateInstanceAndUnwrap, после чего выгрузить домен.
...
Рейтинг: 0 / 0
Reflection.Assembly блокирует файл.
    #39097157
Фотография 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/

Возможно ли этот путь подменить?
...
Рейтинг: 0 / 0
Reflection.Assembly блокирует файл.
    #39097184
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Reflection.Assembly блокирует файл.
    #39097185
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зы: Конечно же File.Delete("MyAnalisingAssembly.dll") разместить после AppDomain.Unload(d)
...
Рейтинг: 0 / 0
Reflection.Assembly блокирует файл.
    #39097382
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такой вариант ближе к истине, но последняя строчка завершается ошибкой:
Код: 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
Reflection.Assembly блокирует файл.
    #39097389
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пометил как <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
Reflection.Assembly блокирует файл.
    #39097459
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Победил. Помогло это:

Код: 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
Reflection.Assembly блокирует файл.
    #39098642
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не совсем победил. При отдаче ссылки на Reflection.Assembly за пределы домена, в котором сборка создается, она загружается и в вызывающий домен, то есть домен студии. Придется всю обработку сборки в AssemblyAnalyser перетаскивать.
...
Рейтинг: 0 / 0
Reflection.Assembly блокирует файл.
    #39099082
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyПридется всю обработку сборки в AssemblyAnalyser перетаскивать.Ну да, ради этого и предложена сборка AssemblyAnalyser.dll, возвращающая модель независимую от классов рефлекшена.
...
Рейтинг: 0 / 0
Reflection.Assembly блокирует файл.
    #39099275
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КAntonariyПридется всю обработку сборки в AssemblyAnalyser перетаскивать.Ну да, ради этого и предложена сборка AssemblyAnalyser.dll, возвращающая модель независимую от классов рефлекшена.Отдельная сборка не нужна, достаточно классов AssemblyAnalyser и AssemblyData, но AssemblyData должен быть сериализуемым (или возможно тоже наследоваться от MarshalByRefObject, уже лень проверять). AssemblyAnalyser инкапсулирует работу с Reflection и типами тех сборок, которые должны быть выгружены, создается в отдельном домене, и этого достаточно.
...
Рейтинг: 0 / 0
Reflection.Assembly блокирует файл.
    #39099308
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyАлексей Кпропущено...
Ну да, ради этого и предложена сборка AssemblyAnalyser.dll, возвращающая модель независимую от классов рефлекшена.Отдельная сборка не нужна, достаточно классов AssemblyAnalyser и AssemblyData, но AssemblyData должен быть сериализуемым (или возможно тоже наследоваться от MarshalByRefObject, уже лень проверять). AssemblyAnalyser инкапсулирует работу с Reflection и типами тех сборок, которые должны быть выгружены, создается в отдельном домене, и этого достаточно.Ну это чтобы во второй домен не загружалось ничего лишнего. Может это "экономия на спичках", спорить не буду. :-)
...
Рейтинг: 0 / 0
Reflection.Assembly блокирует файл.
    #39099666
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При компиляции выхватил ошибку, что заблокирован pdb-файл, перезаписать невозможно. Повторить не получилось.
По-моему студия надо мной издевается.
...
Рейтинг: 0 / 0
Reflection.Assembly блокирует файл.
    #39099945
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Теперь не получается повторить ситуацию, чтобы все работало. Даже откатился к варианту с AssemblyAnalyser в отдельной сборке, гадский pdb блокируется и всё.
авторНе удалось скопировать "obj\Debug\PMan.pdb" в "bin\PMan.pdb"
...
Рейтинг: 0 / 0
Reflection.Assembly блокирует файл.
    #39100257
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё можно исходники парсить а не по скомпилированным сборкам лазить.

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

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


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