c# सी#अप्रबंधित सी डीएलएल निर्यात की सूची प्राप्त करें



dll interop (1)

मेरे निर्यात कार्यों के साथ एक सी डीएलएल है

मैं निर्यात कार्यों की सूची को निकालने के लिए कमांड-लाइन टूल डंपबिन। एक्सई / एक्सपोर्ट्स का उपयोग कर सकता हूं, और फिर इन कार्यों को अपने सी # कोड में (सफलतापूर्वक) कॉल कर सकते हैं।

बाहरी आदेश-रेखा उपकरण का उपयोग किए बिना, इस निर्यात-फ़ंक्शंस-सूची को सीधे नेट से प्राप्त करने का कोई तरीका है?

धन्यवाद


जहाँ तक मुझे पता है कि नेट फ्रेमवर्क में कोई भी वर्ग नहीं है जो आपको आवश्यक जानकारी प्रदान करता है।

हालांकि आप Win32 dbghelp.dll DLL के कार्यों का उपयोग करने के लिए नेट प्लेटफॉर्म के प्लेटफ़ॉर्म इनवोकेशन सेवाओं (PInvoke) का उपयोग कर सकते हैं। यह डीएलएल विंडोज प्लेटफॉर्म के लिए डिबगिंग टूल्स का हिस्सा है । Dbghelp DLL SymEnumerateSymbols64 नामक एक फ़ंक्शन प्रदान करता है जो आपको एक डायनेमिक लिंक लायब्रेरी के सभी निर्यात किए गए प्रतीकों की गणना करने की अनुमति देता है। SymEnumSymbols नामक एक नए फ़ंक्शन भी हैं जो निर्यात किए गए प्रतीकों की गणना करने की भी अनुमति देता है।

नीचे दिए गए कोड में SymEnumerateSymbols64 फ़ंक्शन का उपयोग करने के लिए एक सरल उदाहरण SymEnumerateSymbols64 है।

[DllImport("dbghelp.dll", SetLastError = true, CharSet = CharSet.Unicode)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SymInitialize(IntPtr hProcess, string UserSearchPath, [MarshalAs(UnmanagedType.Bool)]bool fInvadeProcess);

[DllImport("dbghelp.dll", SetLastError = true, CharSet = CharSet.Unicode)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SymCleanup(IntPtr hProcess);

[DllImport("dbghelp.dll", SetLastError = true, CharSet = CharSet.Unicode)]
public static extern ulong SymLoadModuleEx(IntPtr hProcess, IntPtr hFile,
     string ImageName, string ModuleName, long BaseOfDll, int DllSize, IntPtr Data, int Flags);

[DllImport("dbghelp.dll", SetLastError = true, CharSet = CharSet.Unicode)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SymEnumerateSymbols64(IntPtr hProcess,
   ulong BaseOfDll, SymEnumerateSymbolsProc64 EnumSymbolsCallback, IntPtr UserContext);

public delegate bool SymEnumerateSymbolsProc64(string SymbolName,
      ulong SymbolAddress, uint SymbolSize, IntPtr UserContext);

public static bool EnumSyms(string name, ulong address, uint size, IntPtr context)
{
  Console.Out.WriteLine(name);
  return true;
}    

static void Main(string[] args)
{
  IntPtr hCurrentProcess = Process.GetCurrentProcess().Handle;

  ulong baseOfDll;
  bool status;

  // Initialize sym.
  // Please read the remarks on MSDN for the hProcess
  // parameter.
  status = SymInitialize(hCurrentProcess, null, false);

  if (status == false)
  {
    Console.Out.WriteLine("Failed to initialize sym.");
    return;
  }

  // Load dll.
  baseOfDll = SymLoadModuleEx(hCurrentProcess,
                              IntPtr.Zero,
                              "c:\\windows\\system32\\user32.dll",
                              null,
                              0,
                              0,
                              IntPtr.Zero,
                              0);

  if (baseOfDll == 0)
  {
    Console.Out.WriteLine("Failed to load module.");
    SymCleanup(hCurrentProcess);
    return;
  }

  // Enumerate symbols. For every symbol the 
  // callback method EnumSyms is called.
  if (SymEnumerateSymbols64(hCurrentProcess,
      BaseOfDll, EnumSyms, IntPtr.Zero) == false)
  {
    Console.Out.WriteLine("Failed to enum symbols.");
  }

  // Cleanup.
  SymCleanup(hCurrentProcess);
}

उदाहरण को सरल रखने के लिए मैंने SymEnumSymbols फ़ंक्शन का उपयोग नहीं किया। मैंने इस तरह के क्लासेस का इस्तेमाल बिना उदाहरण भी किया है। नेट फ्रेमवर्क के SafeHandle क्लास के रूप में। यदि आपको SymEnumSymbols फ़ंक्शन के लिए एक उदाहरण की आवश्यकता है, तो बस मुझे बताएं





cdecl