আমি নেট নেট অ্যাসেমব্লির একটি ইচ্ছামত তালিকা পেয়েছি।
আমি প্রোগ্রামগতভাবে যাচাই করতে হবে যে প্রতিটি ডিএলএল x86 (x64 বা কোনও সিপিইউ হিসাবে বিপরীতে) জন্য নির্মিত হয়েছিল কিনা। এটা কি সম্ভব?
আমি নেট নেট অ্যাসেমব্লির একটি ইচ্ছামত তালিকা পেয়েছি।
আমি প্রোগ্রামগতভাবে যাচাই করতে হবে যে প্রতিটি ডিএলএল x86 (x64 বা কোনও সিপিইউ হিসাবে বিপরীতে) জন্য নির্মিত হয়েছিল কিনা। এটা কি সম্ভব?
উত্তর:
তাকানো System.Reflection.AssemblyName.GetAssemblyName(string assemblyFile)
আপনি ফিরে আসা সমাবেশ নাম থেকে উদাহরণস্বরূপ মেটাডেটা পরীক্ষা করতে পারেন:
পাওয়ারশেল ব্যবহার :
[৩]] সি: \> [প্রতিবিম্ব FL নাম: Microsoft.GLEE সংস্করণ: 1.0.0.0 সংস্কৃতিআইএনফো: কোডবেস: ফাইল: /// সি: / প্রকল্পগুলি / পাওয়ারশেল / বিল্ডএনলেজার / ... এস্কেপডকোডবেস: ফাইল: /// সি: / প্রকল্পগুলি / পাওয়ারশেল / বিল্ডআনলেজার / ... প্রসেসর আর্কিটেকচার: এমএসআইএল পতাকা: পাবলিককি হাশআলগোরিদম: এসএএএ 1 সংস্করণ সামঞ্জস্যতা: একই মেশিন ine কী পেয়ার: পূর্ণ নাম: মাইক্রোসফ্ট.জিএলইই, সংস্করণ = 1.0.0.0, সংস্কৃতি = নিউট ...
এখানে, প্রসেসর আর্কিটেকচার লক্ষ্য প্ল্যাটফর্মটি সনাক্ত করে।
আমি পদ্ধতিটিতে কল করতে এই উদাহরণে পাওয়ারশেল ব্যবহার করছি।
[reflection.assemblyname]::GetAssemblyName("${pwd}\name.dll")
কখনও কখনও চেষ্টা করুন প্রক্রিয়াটির বর্তমান ডিরেক্টরি বর্তমান সরবরাহকারীর মতো নয় (যা আমি অনুমান করি যে ডিএলএল আপনার জন্য রয়েছে)
// DevDiv 216459: This code originally used Assembly.GetName(), but that requires FileIOPermission, which isn't granted in medium trust. However, Assembly.FullName *is* accessible in medium trust.
দুঃখজনকভাবে একটি মন্তব্য রয়েছে , ব্যবহার না করে প্রসেসর আর্কিটেকচার পড়ার উপায় নেই GetName instance method
; ব্যবহার করে AssemblyName constructor
, ক্ষেত্রটি সর্বদা সেট করা থাকে None
।
কোনও সমাবেশের স্থিতি নির্ধারণের জন্য এবং অ্যাসেম্বলিটিকে একটি খোলার হিসাবে খোলার জন্য আপনি CorFlags CLI সরঞ্জামটি ব্যবহার করতে পারেন (উদাহরণস্বরূপ, সি: \ প্রোগ্রাম ফাইলগুলি \ মাইক্রোসফ্ট এসডিকে \ উইন্ডোজ \ v7.0 \ বিন \ কর্পফ্ল্যাজ.এক্সই) বাইনারি সম্পদ আপনি 32BIT পতাকা 1 ( x86 ) বা 0 (যে কোনও সিপিইউ বা x64 , উপর নির্ভর করে PE
) সেট করে আছে কিনা তা নির্ধারণ করার জন্য আপনাকে কোথায় তা নির্ধারণ করতে হবে :
Option | PE | 32BIT
----------|-------|---------
x86 | PE32 | 1
Any CPU | PE32 | 0
x64 | PE32+ | 0
.NET সহ ব্লগ পোস্ট x64 বিকাশ সম্পর্কে কিছু তথ্য রয়েছে corflags
।
আরও উন্নততর, আপনি নির্ধারণ করতে ব্যবহারModule.GetPEKind
করতে পারেন যে কোনও অ্যাসেমব্লির PortableExecutableKinds
মান PE32Plus
(-৪-বিট), Required32Bit
(৩২-বিট এবং ডাব্লুডাব্লু), বা ILOnly
(কোনও সিপিইউ) অন্যান্য বৈশিষ্ট্য সহ।
কেবল স্পষ্টতার জন্য, CorFlags.exe .NET ফ্রেমওয়ার্ক এসডিকে অংশ । আমার মেশিনে আমার বিকাশের সরঞ্জাম রয়েছে এবং আমার পক্ষে সহজতম উপায়টি নির্ধারণ করে যে কোনও ডিএলএল কেবল 32-বিট কিনা তা হ'ল:
ভিজ্যুয়াল স্টুডিও কমান্ড প্রম্পটটি খুলুন (উইন্ডোজে: মেনু স্টার্ট / প্রোগ্রাম / মাইক্রোসফ্ট ভিজ্যুয়াল স্টুডিও / ভিজ্যুয়াল স্টুডিও সরঞ্জাম / ভিজ্যুয়াল স্টুডিও 2008 কমান্ড প্রম্পট)
প্রশ্নে ডিএলএল ধারণকারী ডিরেক্টরিতে সিডি
এর মতো করফ্ল্যাগগুলি চালান:
corflags MyAssembly.dll
আপনি আউটপুট এরকম কিছু পাবেন:
Microsoft (R) .NET Framework CorFlags Conversion Tool. Version 3.5.21022.8
Copyright (c) Microsoft Corporation. All rights reserved.
Version : v2.0.50727
CLR Header: 2.5
PE : PE32
CorFlags : 3
ILONLY : 1
32BIT : 1
Signed : 0
মতামত অনুসারে উপরের পতাকাগুলি নিম্নরূপ পড়তে হবে:
32BITREQ
এবং 32BITPREF
একটি একক বদলে 32BIT
মান।
আপনি নিজের লেখার সম্পর্কে কীভাবে? উইন্ডোজ 95 এ কার্যকর হওয়ার পরে পি ই আর্কিটেকচারের মূলটি গুরুতরভাবে পরিবর্তিত হয়নি। এখানে একটি সি # উদাহরণ রয়েছে:
public static ushort GetPEArchitecture(string pFilePath)
{
ushort architecture = 0;
try
{
using (System.IO.FileStream fStream = new System.IO.FileStream(pFilePath, System.IO.FileMode.Open, System.IO.FileAccess.Read))
{
using (System.IO.BinaryReader bReader = new System.IO.BinaryReader(fStream))
{
if (bReader.ReadUInt16() == 23117) //check the MZ signature
{
fStream.Seek(0x3A, System.IO.SeekOrigin.Current); //seek to e_lfanew.
fStream.Seek(bReader.ReadUInt32(), System.IO.SeekOrigin.Begin); //seek to the start of the NT header.
if (bReader.ReadUInt32() == 17744) //check the PE\0\0 signature.
{
fStream.Seek(20, System.IO.SeekOrigin.Current); //seek past the file header,
architecture = bReader.ReadUInt16(); //read the magic number of the optional header.
}
}
}
}
}
catch (Exception) { /* TODO: Any exception handling you want to do, personally I just take 0 as a sign of failure */}
//if architecture returns 0, there has been an error.
return architecture;
}
}
এখনকার ধ্রুবকগুলি হ'ল:
0x10B - PE32 format.
0x20B - PE32+ format.
তবে এই পদ্ধতির সাহায্যে এটি নতুন ধ্রুবকগুলির সম্ভাবনার জন্য অনুমতি দেয়, আপনি যথাযথ দেখায় কেবল ফিরতি বৈধ করুন।
কোডপ্লেক্সে এই প্রকল্প থেকে CorFlagsReader ব্যবহার করার চেষ্টা করুন । অন্যান্য সম্মেলনে এর কোনও উল্লেখ নেই এবং এটি যেমন রয়েছে তেমন ব্যবহার করা যেতে পারে।
[TestMethod]
public void EnsureKWLLibrariesAreAll64Bit()
{
var assemblies = Assembly.GetExecutingAssembly().GetReferencedAssemblies().Where(x => x.FullName.StartsWith("YourCommonProjectName")).ToArray();
foreach (var assembly in assemblies)
{
var myAssemblyName = AssemblyName.GetAssemblyName(assembly.FullName.Split(',')[0] + ".dll");
Assert.AreEqual(ProcessorArchitecture.MSIL, myAssemblyName.ProcessorArchitecture);
}
}
নীচে একটি ব্যাচ ফাইল রয়েছে যা corflags.exe
সকলের বিরুদ্ধে dlls
এবং exes
বর্তমান কার্যনির্বাহী ডিরেক্টরি এবং সমস্ত উপ ডিরেক্টরিতে চলবে , ফলাফলগুলি বিশ্লেষণ করবে এবং প্রতিটিটির লক্ষ্য স্থিতি প্রদর্শন করবে।
corflags.exe
যে সংস্করণটি ব্যবহৃত হয় তার উপর নির্ভর করে আউটপুটটিতে লাইন আইটেমগুলি হয় অন্তর্ভুক্ত করবে 32BIT
, বা 32BITREQ
(এবং 32BITPREF
) । এই দুটির মধ্যে যে কোনও একটি আউটপুটে অন্তর্ভুক্ত করা হ'ল সমালোচনামূলক লাইন আইটেম যা অবশ্যই Any CPU
এবং এর মধ্যে পার্থক্য দেখানোর জন্য চেক করা উচিত x86
। যদি আপনি corflags.exe
(প্রাক উইন্ডোজ এসডিকে ভি 8.0 এ) এর একটি পুরানো সংস্করণ ব্যবহার করে থাকেন তবে অন্যরা পূর্ববর্তী উত্তরে 32BIT
সূচিত হিসাবে কেবল আউটপুটটিতে কেবল লাইন আইটেম উপস্থিত থাকবে। অন্যথায় 32BITREQ
এবং 32BITPREF
এটি প্রতিস্থাপন।
এই অনুমান corflags.exe
হয় %PATH%
। এটি নিশ্চিত করার সবচেয়ে সহজ উপায় হ'ল এ Developer Command Prompt
। বিকল্পভাবে আপনি এটির ডিফল্ট অবস্থান থেকে এটি অনুলিপি করতে পারেন ।
নীচের ব্যাচ ফাইলটি যদি কোনও পরিচালনা না করা dll
বা exe
এটির বিরুদ্ধে চালানো হয় তবে এটি ভুল হিসাবে এটি প্রদর্শিত হবে x86
, যেহেতু আসল আউটপুটটি Corflags.exe
ত্রুটির বার্তার মতো হবে:
করফ্ল্যাগস: ত্রুটি সিএফ 800: নির্দিষ্ট ফাইলটির কোনও বৈধ পরিচালিত শিরোনাম নেই
@echo off
echo.
echo Target architecture for all exes and dlls:
echo.
REM For each exe and dll in this directory and all subdirectories...
for %%a in (.exe, .dll) do forfiles /s /m *%%a /c "cmd /c echo @relpath" > testfiles.txt
for /f %%b in (testfiles.txt) do (
REM Dump corflags results to a text file
corflags /nologo %%b > corflagsdeets.txt
REM Parse the corflags results to look for key markers
findstr /C:"PE32+">nul .\corflagsdeets.txt && (
REM `PE32+` indicates x64
echo %%~b = x64
) || (
REM pre-v8 Windows SDK listed only "32BIT" line item,
REM newer versions list "32BITREQ" and "32BITPREF" line items
findstr /C:"32BITREQ : 0">nul /C:"32BIT : 0" .\corflagsdeets.txt && (
REM `PE32` and NOT 32bit required indicates Any CPU
echo %%~b = Any CPU
) || (
REM `PE32` and 32bit required indicates x86
echo %%~b = x86
)
)
del corflagsdeets.txt
)
del testfiles.txt
echo.
আর একটি উপায় হ'ল ডিএলএলে ভিজ্যুয়াল স্টুডিও সরঞ্জামগুলি থেকে ডাম্পবিন ব্যবহার করা এবং উপযুক্ত আউটপুট সন্ধান করা
dumpbin.exe /HEADERS <your dll path>
FILE HEADER VALUE
14C machine (x86)
4 number of sections
5885AC36 time date stamp Mon Jan 23 12:39:42 2017
0 file pointer to symbol table
0 number of symbols
E0 size of optional header
2102 characteristics
Executable
32 bit word machine
DLL
দ্রষ্টব্য: ও / পি এর উপরে 32 বিট ডিএল এর জন্য
ডাম্পবিন.এক্সইএর সাথে আরও একটি দরকারী বিকল্প হ'ল / এক্সপোর্টস, এটি আপনাকে ডিএল দ্বারা প্রকাশিত ফাংশনটি দেখাবে
dumpbin.exe /EXPORTS <PATH OF THE DLL>
আরও সাধারণ উপায় - সাক্ষ্য এবং চিত্রের ধরণ নির্ধারণ করতে ফাইলের কাঠামো ব্যবহার করুন:
public static CompilationMode GetCompilationMode(this FileInfo info)
{
if (!info.Exists) throw new ArgumentException($"{info.FullName} does not exist");
var intPtr = IntPtr.Zero;
try
{
uint unmanagedBufferSize = 4096;
intPtr = Marshal.AllocHGlobal((int)unmanagedBufferSize);
using (var stream = File.Open(info.FullName, FileMode.Open, FileAccess.Read))
{
var bytes = new byte[unmanagedBufferSize];
stream.Read(bytes, 0, bytes.Length);
Marshal.Copy(bytes, 0, intPtr, bytes.Length);
}
//Check DOS header magic number
if (Marshal.ReadInt16(intPtr) != 0x5a4d) return CompilationMode.Invalid;
// This will get the address for the WinNT header
var ntHeaderAddressOffset = Marshal.ReadInt32(intPtr + 60);
// Check WinNT header signature
var signature = Marshal.ReadInt32(intPtr + ntHeaderAddressOffset);
if (signature != 0x4550) return CompilationMode.Invalid;
//Determine file bitness by reading magic from IMAGE_OPTIONAL_HEADER
var magic = Marshal.ReadInt16(intPtr + ntHeaderAddressOffset + 24);
var result = CompilationMode.Invalid;
uint clrHeaderSize;
if (magic == 0x10b)
{
clrHeaderSize = (uint)Marshal.ReadInt32(intPtr + ntHeaderAddressOffset + 24 + 208 + 4);
result |= CompilationMode.Bit32;
}
else if (magic == 0x20b)
{
clrHeaderSize = (uint)Marshal.ReadInt32(intPtr + ntHeaderAddressOffset + 24 + 224 + 4);
result |= CompilationMode.Bit64;
}
else return CompilationMode.Invalid;
result |= clrHeaderSize != 0
? CompilationMode.CLR
: CompilationMode.Native;
return result;
}
finally
{
if (intPtr != IntPtr.Zero) Marshal.FreeHGlobal(intPtr);
}
}
সংকলন মোড গণনা
[Flags]
public enum CompilationMode
{
Invalid = 0,
Native = 0x1,
CLR = Native << 1,
Bit32 = CLR << 1,
Bit64 = Bit32 << 1
}
গিটহাবের ব্যাখ্যা সহ উত্স কোড
আমি একটি দুর্দান্ত হ্যান্ডেল সরঞ্জামটি ক্লোন করেছি যা উইন্ডোজ এক্সপ্লোরারগুলিতে সমস্ত উপলভ্য তথ্য দেখানোর জন্য সমাবেশগুলির জন্য একটি প্রসঙ্গ মেনু এন্ট্রি যুক্ত করে:
এখানে ডাউনলোড করুন: https://github.com/tebjan/AsorsesInformation/releases
NET সমাবেশের লক্ষ্য প্ল্যাটফর্ম চেক করার আরেকটি উপায় হ'ল NET রিফ্লেক্টর সহ সমাবেশটি পরিদর্শন করছে ...
@ # ~ # € ~! আমি ঠিক বুঝতে পেরেছি যে নতুন সংস্করণটি নিখরচায় নয়! সুতরাং, সংশোধন করুন, যদি আপনার কাছে। নেট প্রতিফলকটির একটি মুক্ত সংস্করণ থাকে তবে আপনি লক্ষ্য প্ল্যাটফর্মটি পরীক্ষা করতে এটি ব্যবহার করতে পারেন।
সিএফডুক গেটপেইকাইন্ড কল করার সম্ভাবনাটি নোট করে। পাওয়ারশেল থেকে এটি করা সম্ভাব্য আকর্ষণীয়।
এখানে উদাহরণস্বরূপ, একটি সেমিডলেট জন্য কোড যা ব্যবহার করা যেতে পারে: https://stackoverflow.com/a/16181743/64257
বিকল্পভাবে, https://stackoverflow.com/a/4719567/64257 এ লক্ষ্য করা যায় যে " পাওয়ারশেল সম্প্রদায় এক্সটেনশনে গেট-পিইইইডার সিএমডিলেট রয়েছে যা এক্সিকিউটেবল ইমেজগুলির জন্য পরীক্ষার জন্য ব্যবহার করা যেতে পারে" "
এর জন্য আরও উন্নত অ্যাপ্লিকেশনটি আপনি এখানে পেতে পারেন: কোডপ্লেক্স - এপি চ্যাঞ্জ
উদাহরণ:
C:\Downloads\ApiChange>ApiChange.exe -CorFlags c:\Windows\winhlp32.exe
File Name; Type; Size; Processor; IL Only; Signed
winhlp32.exe; Unmanaged; 296960; X86
C:\Downloads\ApiChange>ApiChange.exe -CorFlags c:\Windows\HelpPane.exe
File Name; Type; Size; Processor; IL Only; Signed
HelpPane.exe; Unmanaged; 733696; Amd64
ইতিমধ্যে উল্লিখিত সরঞ্জামগুলির একটি বিকল্প হ'ল টেলরিক জাস্টডেকম্পাইল (ফ্রি সরঞ্জাম) যা সমাবেশ নামটির পরবর্তী তথ্য প্রদর্শন করবে: