पढ़ कर एक डीएल एक। Valid सीएलआर डीएल है, मैं 32 बिट वेब एप्लिकेशन को 64 बिट में माइग्रेट करने पर काम कर रहा हूं और हमारे प्लगइन लोडर कोड के साथ कुछ समस्याएं हैं।यह निर्धारित करना कि पीई सीधे (64 बिट अंक)
32 बिट संस्करण में, हम सभी .net dlls के लिए वेबपैस बिन निर्देशिका स्कैन करते हैं, फिर हमारे प्लगइन विशेषताओं की उपस्थिति की जांच के लिए उन्हें Assembly.Load
के साथ लोड करें।
हम एक नहीं बल्कि गंधा तरह से ऐसा किया सार्वजनिक क्षेत्र कोड का उपयोग:
/// <summary>
/// Returns true if the file specified is a real CLR type,
/// otherwise false is returned.
/// False is also returned in the case of an exception being caught
/// </summary>
/// <param name="file">A string representing the file to check for
/// CLR validity</param>
/// <returns>True if the file specified is a real CLR type,
/// otherwise false is returned.
/// False is also returned in the case of an exception being
/// caught</returns>
public static bool IsDotNetAssembly(String file)
{
Stream fs = new FileStream(@file, FileMode.Open, FileAccess.Read);
try
{
BinaryReader reader = new BinaryReader(fs);
//PE Header starts @ 0x3C (60). Its a 4 byte header.
fs.Position = 0x3C;
uint peHeader = reader.ReadUInt32();
//Moving to PE Header start location...
fs.Position = peHeader;
uint peHeaderSignature = reader.ReadUInt32();
ushort machine = reader.ReadUInt16();
ushort sections = reader.ReadUInt16();
uint timestamp = reader.ReadUInt32();
uint pSymbolTable = reader.ReadUInt32();
uint noOfSymbol = reader.ReadUInt32();
ushort optionalHeaderSize = reader.ReadUInt16();
ushort characteristics = reader.ReadUInt16();
// PE Optional Headers
// To go directly to the datadictionary, we'll increase the stream's current position to with 96 (0x60).
// 28 bytes for Standard fields
// 68 bytes for NT-specific fields
// 128 bytes DataDictionary
// DataDictionay has 16 directories
// 8 bytes per directory (4 bytes RVA and 4 bytes of Size.)
// 15th directory consist of CLR header! (if its 0, it is not a CLR file)
uint[] dataDictionaryRVA = new uint[16];
uint[] dataDictionarySize = new uint[16];
ushort dataDictionaryStart = Convert.ToUInt16(Convert.ToUInt16(fs.Position) + 0x60);
fs.Position = dataDictionaryStart;
for (int i = 0; i < 15; i++)
{
dataDictionaryRVA[i] = reader.ReadUInt32();
dataDictionarySize[i] = reader.ReadUInt32();
}
if (dataDictionaryRVA[14] == 0)
{
fs.Close();
return false;
}
else
{
fs.Close();
return true;
}
}
catch (Exception)
{
return false;
}
finally
{
fs.Close();
}
}
अब समस्या अब हम 64 बिट या मंच स्वतंत्र DLLs को संभालने के लिए है और ऑफसेट बदल गया है लगता है और इस कोड में विफल रहता है । क्या कोई भी उपरोक्त कोड में सही 64 बिट केवल या मंच स्वतंत्र डीएलएस के लिए सही लौटने के लिए सही संशोधन जानता है?
क्या आपको वास्तव में उपरोक्त कोड का उपयोग करना है? – Hans
निफ्टी? कार्यान्वयन-विशिष्ट, धारणा बनाने और बाध्य करने के लिए परेशानी-जैसे-परेशानी की तरह ... ओह रुको, यह पहले से ही हुआ है। :) – bzlm
वेब एप्लिकेशन विशाल है - बिन निर्देशिका में 100 से अधिक डीएलएस के साथ। कई डीएल हमारे ऐप के लिए प्लगइन्स नहीं हैं और कई क्लियर डीएलएस नहीं हैं, इसलिए असेंबली का उपयोग करना। लोड एक अच्छा विकल्प नहीं है। – Vaevictus