Как пакет dll C # управляется с управляемым приложением C #, не оставляя позади файлы? - PullRequest
0 голосов
/ 16 марта 2010

Я прочитал два других потока, которые извлекают dll из приложения во время выполнения. Один из этих методов использовал текущий временный каталог Windows для сохранения библиотеки DLL, но это была неуправляемая библиотека DLL, которую нужно было импортировать во время выполнения с DllImport. Предполагая, что моя управляемая dll экспортирована во временный каталог, как правильно связать эту управляемую сборку с моим текущим проектом MSVC #?

1 Ответ

3 голосов
/ 16 марта 2010

Вам вообще не нужно сохранять временный каталог.Просто поместите управляемую dll как «встроенный ресурс» в ваш проект.Затем подключите событие Appdomain.AssemblyResolve и в этом случае загрузите ресурс как поток байтов, загрузите сборку из потока и верните ее.

Пример кода:

// Windows Forms:
// C#: The static contructor of the 'Program' class in Program.cs
// VB.Net: 'MyApplication' class in ApplicationEvents.vb (Project Settings-->Application Tab-->View Application Events)
// WPF:
// The 'App' class in WPF applications (app.xaml.cs/vb)

static Program() // Or MyApplication or App as mentioned above
{
    AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
}

static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
    if (args.Name.Contains("Mydll"))
    {
        // Looking for the Mydll.dll assembly, load it from our own embedded resource
        foreach (string res in Assembly.GetExecutingAssembly().GetManifestResourceNames())
        {
            if(res.EndsWith("Mydll.dll"))
            {
                Stream s = Assembly.GetExecutingAssembly().GetManifestResourceStream(res);
                byte[] buff = new byte[s.Length];
                s.Read(buff, 0, buff.Length);
                return Assembly.Load(buff);
            }
        }
    }
    return null;
} 
...