我可以模拟 DllImport-ed 函数吗?

Can I mock a DllImport-ed function?

假设我有一个添加自定义类型的 powershell 脚本,例如:

Add-Type -TypeDefinition @'

   public struct LogEntry {
       //...
   }

    public static class Native
    {
        [DllImport("some.dll", EntryPoint = "GetLogs")]
        public static extern UInt32 GetLogs([Out] LogEntry[] results);
     }
'@

我可以模拟此 GetLogs() 以便 return 测试数据而不是调用我的本机 DLL 吗?

InModuleScope "mod.psd1"  {
    Describe "Process logs" {
        Context "Function Exists" {
        //failed: Mock [Native]::GetLogs { return 5 } -Verifiable 
        //failed: Mock [Native] -member GetLogs { return 5 } -Verifiable 

        It "Should work" {
           [Native]::GetLogs | should be 5
         }
        }
    }
}

我收到此错误的变体(第一个语法抱怨 [Native]::GetLogs,第二个语法抱怨 [Native]。

[-] Error occurred in Context block 3.13s
[13352]       CommandNotFoundException: Could not find Command [Native]
[13352]       at Validate-Command, C:\Program Files\WindowsPowerShell\Modules\Pester.4.0\Functions\Mock.ps1: line 801
[13352]       at Mock, C:\Program Files\WindowsPowerShell\Modules\Pester.4.0\Functions\Mock.ps1: line 168

是不是在我的模块中找不到模拟目标的问题,因为它是动态添加的?还是我只是做错了(最有可能的情况)?

假设您使用的是 5.1,您可以创建一个模拟 class:

class Native {
    static [int] GetLogs() {
        return 5
    }
}

然后您可以调用:

[Native]::GetLogs()
# => 5

顺便说一句,无论您真正做什么,模拟互操作都会很困难。