SORU
20 EYLÜL 2008, CUMARTESİ


Yan yana derlemeler DLL x 64 veya 32 sürümünü kullanarak yükleme

C yönetilen bir derleme iki versiyonu, x 86 ve x 64 için bir tane var. Bu kurul tarafından verilir .net uygulama AnyCPU için uygun. Dosya kopyalama ile bizim kod yüklemek açıyoruz, ve bunu yapmaya devam etmek istiyorum.

Yan yana derleme bir uygulama dinamik olarak bu işlemci mimarisi seçerken sırasıyla x 86 veya x 64 yükleniyor derleme bildirimi kullanmak mümkün mü? Yoksa bu dosyayı kopyala bir dağıtım (örneğin GAC kullanarak) halletmek için başka bir yol var mı?

CEVAP
1 EKİM 2008, ÇARŞAMBA


Bir yürütülebilir AnyCPU olarak derlenmiş platform-özel derleme yüklemek için basit bir çözüm ürettim. Tekniğe aşağıdaki gibi özetlenebilir

  1. Varsayılan emin olun .("Fusion" motoru) x 86 veya x 64 sürümü bulamıyorum platforma özel derleme . NET derleme yükleme mekanizması
  2. Ana uygulama girişimleri yüklemeden önce platforma özel derleme, geçerli Uygulama etki alanı özel bir derleme çözümleyici yükleyin
  3. Şimdi ne zaman ana uygulama ihtiyacı platforma özel derleme, Füzyon motoru vazgeçebilir (step 1) ve çağrı özel çözümleyici (step 2); özel çözümleyici belirliyoruz geçerli platform kullanın ve dizin tabanlı arama için yük uygun DLL.

Bu tekniği göstermek için bir komut satırı kısa öğretici göre ekleme yapıyorum. Windows üzerinde ortaya çıkan ikili XP x 86 ve Windows Vista SP1 64 (ikili, dağıtım gibi kopyalayarak) test ettim.

NOT 1: "csc.exe" C-sharp derleyici. Bu öğretici yolda olduğunu varsayar (benim test kullanıldı "") C:\WINDOWS\Microsoft.NET\Framework\v3.5\csc.exe

NOT 2Bu konumu, ör . için ayarlanmış testleri ve çalıştırın komut satırı (veya) powershell için geçici bir klasör oluşturmanızı tavsiye ederim

(cmd.exe)
C:
mkdir \TEMP\CrossPlatformTest
cd \TEMP\CrossPlatformTest

Adım 1: Platforma özel derleme basit bir C ile temsil edilir# sınıf kitaplığı:

// file 'library.cs' in C:\TEMP\CrossPlatformTest
namespace Cross.Platform.Library
{
	public static class Worker
	{
		public static void Run()
		{
			System.Console.WriteLine("Worker is running");
			System.Console.WriteLine("(Enter to continue)");
			System.Console.ReadLine();
		}
	}
}

Adım 2: Özel platform derlemeler komut satırı basit komutları kullanarak derleme:

(cmd.exe from Note 2)
mkdir platform\x86
csc /out:platform\x86\library.dll /target:library /platform:x86 library.cs
mkdir platform\amd64
csc /out:platform\amd64\library.dll /target:library /platform:x64 library.cs

Adım 3: Ana program iki bölüme ayrılır. "Önyükleyici" yürütülebilir için ana giriş noktası içerir ve geçerli uygulama etki alanı özel bir derleme çözümleyici kaydeder:

// file 'bootstrapper.cs' in C:\TEMP\CrossPlatformTest
namespace Cross.Platform.Program
{
	public static class Bootstrapper
	{
		public static void Main()
		{
			System.AppDomain.CurrentDomain.AssemblyResolve  = CustomResolve;
			App.Run();
		}

		private static System.Reflection.Assembly CustomResolve(
			object sender,
			System.ResolveEventArgs args)
		{
			if (args.Name.StartsWith("library"))
			{
				string fileName = System.IO.Path.GetFullPath(
					"platform\\"
					  System.Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE")
					  "\\library.dll");
				System.Console.WriteLine(fileName);
				if (System.IO.File.Exists(fileName))
				{
					return System.Reflection.Assembly.LoadFile(fileName);
				}
			}
			return null;
		}
	}
}

"Program" "" uygulama uygulama (not Uygulaması.gerçek Çalışma Önyükleyici sonunda çağrılmıştır.Başlıca):

// file 'program.cs' in C:\TEMP\CrossPlatformTest
namespace Cross.Platform.Program
{
	public static class App
	{
		public static void Run()
		{
			Cross.Platform.Library.Worker.Run();
		}
	}
}

Adım 4: Komut satırı: ana uygulamayı derleyin

(cmd.exe from Note 2)
csc /reference:platform\x86\library.dll /out:program.exe program.cs bootstrapper.cs

Adım 5Şimdi işimiz bitti. Oluşturulan dizin yapısı aşağıdaki gibi olmalıdır

(C:\TEMP\CrossPlatformTest, root dir)
    platform (dir)
        amd64 (dir)
            library.dll
        x86 (dir)
            library.dll
    program.exe
    *.cs (source files)

Şimdi 32 bit bir platform, platform\x86\library.dll üzerinde program.exe çalıştırmak için yüklenecek; eğer 64 bit bir platform, platform\amd64\library.dll üzerinde program.exe çalıştırırsanız yüklenecek. Konsol ekledim unutmayın.() Atayarak İşçi sonunda.Yöntem Görev Yöneticisi/process explorer yüklü DLL araştırmak için kullanabileceğiniz çok çalıştırmak veya Visual Studio/Windows hata ayıklama işlemi için çağrı vb yığını görmek takmak için kullanabilirsiniz.

Program.exe çalıştırıldığında, özel Meclis bizim çözümleyici geçerli uygulama etki alanı için bağlı olduğu. En kısa sürede .NET Program sınıfı, 'kütüphane' montaj, yükleme çalışır. bir bağımlılık görüyor yüklemeye başlar Ancak, böyle bir düzeneği bulundu/* alt dizinleri platformda sakladık çünkü). Neyse ki, bizim özel çözümleyici bizim hile bilir ve uygun bir platform Meclisi yükleme çalışır geçerli platform tabanlı/* alt.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jonathan Morrison

    Jonathan Mor

    24 Mart 2010
  • krotoflik

    krotoflik

    26 ŞUBAT 2011
  • michellefeng's channel

    michellefeng

    26 Kasım 2006