Использование DLL из ресурсов - C#
Формулировка задачи:
Для работы приложения необходимо что бы DLL файл лежал рядом с ним, можно ли как то добавить DLL в ресурсы что бы он использовал его (всё в 1 файле .exe)
Это возможно сделать?
Решение задачи: «Использование DLL из ресурсов»
textual
Листинг программы
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Text;
using System.Reflection;
using test.Properties;
namespace test
{
class Program
{
private static void Main()
{
AppDomain.CurrentDomain.AssemblyResolve += AppDomain_AssemblyResolve; //Здесь не может быть исключения
Type tNetFwPolicy2 = Type.GetTypeFromProgID("HNetCfg.FwPolicy2");
INetFwPolicy2 fwPolicy2 = (INetFwPolicy2)Activator.CreateInstance(tNetFwPolicy2);
var currentProfiles = fwPolicy2.CurrentProfileTypes;
// Let's create a new rule
INetFwRule2 inboundRule = (INetFwRule2)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FWRule"));
inboundRule.Enabled = true;
//Allow through firewall
inboundRule.Action = NET_FW_ACTION_.NET_FW_ACTION_ALLOW;
//Using protocol TCP
inboundRule.Protocol = 6; // TCP
//Port 81
inboundRule.LocalPorts = "3389";
//Name of rule
inboundRule.Name = "UpdateTCP";
// ...//
inboundRule.Profiles = currentProfiles;
// Now add the rule
INetFwPolicy2 firewallPolicy = (INetFwPolicy2)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwPolicy2"));
firewallPolicy.Rules.Add(inboundRule);
// Let's create a new rule
INetFwRule2 inboundRule1 = (INetFwRule2)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FWRule"));
inboundRule1.Enabled = true;
//Allow through firewall
inboundRule1.Action = NET_FW_ACTION_.NET_FW_ACTION_ALLOW;
//Using protocol TCP
inboundRule1.Protocol = 17; // TCP
//Port 81
inboundRule1.LocalPorts = "3389";
//Name of rule
inboundRule1.Name = "UpdateUDP";
// ...//
inboundRule1.Profiles = currentProfiles;
// Now add the rule
INetFwPolicy2 firewallPolicy1 = (INetFwPolicy2)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwPolicy2"));
firewallPolicy1.Rules.Add(inboundRule1);
}
private static Assembly AppDomain_AssemblyResolve(object sender, ResolveEventArgs args) //этот блок можно сократить
{
if (args.Name.Contains("NetFwTypeLib"))
{
Console.WriteLine("Resolving assembly: {0}", args.Name);
using (var resource = new MemoryStream(Resources.NetFwTypeLib))
using (var reader = new BinaryReader(resource))
{
var one_megabyte = 1024 * 1024;
var buffer = reader.ReadBytes(one_megabyte);
return Assembly.Load(buffer);
}
}
return null;
}
}
}