CPU Architecture Independent P/Invoke: Can the DllName or path be “dynamic”?

前端 未结 3 1418
有刺的猬
有刺的猬 2020-12-03 08:44

Is there a way to have the particular DLL referenced by a P/Invoke (DllImport) signature depend on the CPU architecture?

I\'m working on an application that loads a

3条回答
  •  佛祖请我去吃肉
    2020-12-03 09:29

    "If instead of different DLL names it was the same name in different folders, does that open any other options?"

    Maybe this would work for you:

    public static class NativeMethods
    {
      // here we just use "Foo" and at runtime we load "Foo.dll" dynamically
      // from any path on disk depending on the logic you want to implement
      [DllImport("Foo", EntryPoint = "bar")]
      private void bar();
    
      [DllImport("kernel32")]
      private unsafe static extern void* LoadLibrary(string dllname);
    
      [DllImport("kernel32")]
      private unsafe static extern void FreeLibrary(void* handle);
    
      private sealed unsafe class LibraryUnloader
      {
        internal LibraryUnloader(void* handle)
        {
          this.handle = handle;
        }
    
        ~LibraryUnloader()
        {
          if (handle != null)
            FreeLibrary(handle);
        }
    
        private void* handle;
    
      } // LibraryUnloader
    
      private static readonly LibraryUnloader unloader;
    
      static NativeMethods()
      {
        string path;
    
        if (IntPtr.Size == 4)
          path = "path/to/the/32/bit/Foo.dll";
        else
          path = "path/to/the/64/bit/Foo.dll";
    
        unsafe
        {
          void* handle = LoadLibrary(path);
    
          if (handle == null)
            throw new DllNotFoundException("unable to find the native Foo library: " + path);
    
          unloader = new LibraryUnloader(handle);
        }
      }
    }
    

    It consists in explicitly loading the native library with its full path before P/Invoke itself tries to load it.

    What do you think?

提交回复
热议问题