C# DllImport在搜索DLL时是否遵循安全DLLSearch模式?

C# DllImport在搜索DLL时是否遵循安全DLLSearch模式?,c#,runtime,dllimport,C#,Runtime,Dllimport,假设我想在某个DLL中进行一个典型的非托管调用: [DllImport("unmanaged.dll")] static extern int SomeFuncion1(int parm); 是否根据注册表中的设置搜索DLL?我在MSDN中找不到任何指示搜索顺序是否遵循“标准搜索顺序”的内容。是的,p/Invoke marshaller只使用LoadLibrary()。它观察环境。这是无法证明的,它实际上是在一个SO的帖子,直到你自己尝试,我得出结论,相当肯定没有合理的选择。LoadLibra

假设我想在某个DLL中进行一个典型的非托管调用:

[DllImport("unmanaged.dll")]
static extern int SomeFuncion1(int parm);

是否根据注册表中的设置搜索DLL?我在MSDN中找不到任何指示搜索顺序是否遵循“标准搜索顺序”的内容。

是的,p/Invoke marshaller只使用LoadLibrary()。它观察环境。这是无法证明的,它实际上是在一个SO的帖子,直到你自己尝试,我得出结论,相当肯定没有合理的选择。LoadLibrary完全属于“硬”API函数的范畴

Fwiw,它将永远找不到带有[DllImport]声明的DLL。非托管DLL只有一个路径,它们没有版本、区域性、pkt等托管程序集属性。如果这实际上是具有这些属性的托管程序集,则使用assembly.load()加载它。但是调用静态函数会很困难,CLR不支持,每个方法都必须属于一个类


使用该DLL上的Dumpbin.exe/exports来找出实际从该DLL导出的内容。

哦,我很不耐烦,自己回答了这个问题,但Hans同时回答了

首先,我创建了一个测试工具:

[DllImport("SomeDllThatDoesntExist.dll")]
public static extern void Test();

static void Main()
{
     string currentWorkingDirectory = Directory.GetCurrentDirectory();
     Console.WriteLine(currentWorkingDirectory);
     Directory.SetCurrentDirectory("E:\\foobar");
     currentWorkingDirectory = Directory.GetCurrentDirectory();
     Console.WriteLine(currentWorkingDirectory);
     // Call method in DLL we know doesn't exist.
     Test();
}
然后我用监视它,在
Test()
调用上的搜索路径顺序是:

  • 执行目录
  • System32目录
  • 系统目录(16位)
  • Windows目录
  • 当前目录(“E:\foobar”)
  • 所有我的$PATH目录
  • 这表明它遵守“安全”搜索顺序,因为当前目录是#5而不是#2,如果禁用了SafedlSearchMode,则会是这样。然后我添加了
    HKEY\U LOCAL\U MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\SafedlSearchMode
    注册表值并将其设置为1(禁用),然后再次运行我的测试工具。当时的搜索路径实际上是相同的。我不知道我是否在添加注册表项时出错,但我真正想知道的唯一重要的事情是,默认情况下,它是否遵循“安全”的搜索顺序路径-这意味着当前目录不在顺序中。

    btw from msdn->您可以提供完整或相对路径。如果未提供路径,则DLL在运行时必须位于当前路径中,除非通过其他方式加载DLL。但是,请注意,如果移动DLL,使用完全限定路径可能会导致不准确。