.NET Assembly’lerini tek dosya içine gömmek

Merhaba,

Uzun zamandır blog’uma ek yapmaya vaktim olmamış…

Bugün bir ihtiyaç doğdu ve bir çok .dll dosyasına referans veren bir projeyi tek bir .exe dosyası kullanarak çalıştırmam/paylaşmam gerekti. Biraz araştırma yaptım ve aşağıdaki örneği buldum. Benim projemde düzgün çalıştı.

Siz de Windows Forms uygulamalarınızı veya kütüphane projelerinizi tek bir assembly veya tek bir .exe dosyası ile deploy etmek istiyorsanız aşağıdaki adımları izleyebilirsiniz.

  1. Projemize bir resource dosyası ekliyoruz.
  2. Resource dosyasının özelliklerine girip Build Action:Embedded Resource olarak kullanıldığından emin oluyoruz.
  3. Resource dosyamızın içine istediğimiz dll’leri ekliyoruz.
  4. Aşağıdaki örnekteki gibi programın girişine ResourceAssembly ile ilgili yeşil renk ile yazdığım iki satır kodu ekliyoruz. Burada DefaultNamespaceAdi ve ResourceAdi kısımlarınızı kendi projenizdeki isimlerle değiştirmeyi unutmayın.

[STAThread]
static void Main()
{
            ResourceAssemblyLoader.ResourceName = “DefaultNamespaceAdi.ResourceAdi”;
            ResourceAssemblyLoader.LoadAssemblies();

Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new frmMain());
}
}

5. Alltaki sınıfı projenize ekleyin.

public class ResourceAssemblyLoader
{
static Dictionary libs = new Dictionary();
public static string ResourceName;

public static void LoadAssemblies()
{
AppDomain.CurrentDomain.AssemblyResolve += FindAssem;
}

static Assembly FindAssem(object sender, ResolveEventArgs args)
{
Assembly result;

string dllName = args.Name.Contains(‘,’) ? args.Name.Substring(0, args.Name.IndexOf(‘,’)) : args.Name.Replace(“.dll”, “”);
if (libs.ContainsKey(dllName))
{
result = libs[dllName];
}
else
{
dllName = dllName.Replace(“.”, “_”);
if (dllName.EndsWith(“_resources”)) return null;
ResourceManager rm = new ResourceManager(ResourceName, Assembly.GetExecutingAssembly());
byte[] bytes = (byte[])rm.GetObject(dllName);

result = Assembly.Load(bytes);
libs[dllName] = result;
}

return result;
}

6. Artık bin dizini altında debug ve ya release bölümündeki kodunuzu referans verdiğiniz dll’leri silip deneyebilirsiniz.

Herkese sevgiler saygılar