小编Jim*_*ans的帖子

我可以使用 .NET SafeHandle 类并确定性地释放其中的句柄吗?

我有一个 .NET 项目,我在其中从资源中提取,在运行时并基于平台位,包含我需要使用的函数的本机代码 .DLL。我使用 LoadLibrary、GetProcAddress 和 FreeLibrary 来管理我的托管代码中库的加载和使用。

使用完本机库后,我想将其删除。下面是一些伪代码,显示了当前实现的工作流程:

internal class MyClass()
{    
    string nativeLibraryPath = "C:\my\path\to\extracted\library.dll";
    IntPtr nativeLibraryHandle = IntPtr.Zero;

    public void Load()
    {
        nativeLibraryHandle = NativeMethods.LoadLibrary(nativeLibraryPath);
    }

    public void ExecuteFunction()
    {
        IntPtr functionPointer = NativeMethods.GetProcAddress(nativeLibraryHandle, "MyFunctionName");
        // assume MyManagedDelegate is defined as the correct delegate type.
        MyManagedDelegate managedFunction = Marshal.GetDelegateForFunctionPointer(functionPointer, typeof(MyManagedDelegate)) as MyManagedDelegate;
        managedFunction("foo", "bar");
    }

    public void Unload()
    {
        NativeMethods.FreeLibrary(nativeLibraryHandle);
        File.Delete(nativeLibraryPath);
    }
}
Run Code Online (Sandbox Code Playgroud)

这在使用 IntPtr 类型的变量时工作正常。盛行的智慧(最佳实践?)表明 SafeHandle 可能是更好的方法。但是,我的理解是,在使用 SafeHandle 时,不会确定性地调用 ReleaseHandle() 方法。也就是说,在 SafeHandle 上调用 Close() …

c# pinvoke

3
推荐指数
1
解决办法
1534
查看次数

在 C++ 中使用多态性进行初始化的预期行为是什么?

这应该是一个简单的 100 级问题,但我在我的项目中看到了一些我没有想到的东西,并且网络搜索失败了,所以我想我应该在这里问。假设我有以下 C++ 代码:

class BaseClass {
public:
  BaseClass() { 
    this->Initialize(); 
  }

  int foo() {
    return this->foo_;
  }

protected:
  virtual int GetInitialValue() { 
    return 1; 
  }

private:
  void Initialize() {
    this->foo_ = this->GetInitialValue();
  }

  int foo_;
};

class DerivedClass : public BaseClass {
public:
  DerivedClass() : BaseClass() {
  }

protected:
  virtual int GetInitialValue() { 
    return 2; 
  }
};
Run Code Online (Sandbox Code Playgroud)

的返回值应该是多少DerivedClass::foo()?会BaseClass::GetInitialValue()被叫到吗,还是永远都会DerivedClass::GetInitialValue()被叫到?我应该在哪里搜索,应该使用哪些搜索词来找到答案?

c++ polymorphism

2
推荐指数
1
解决办法
387
查看次数

by.id比by.tagname好吗?

我正在使用webdriver从gmail阅读邮件,在此之间,我在By.id和By.tagname之间找到了这个区别.

我试图访问一个id为":pg"的"表".所以,我可以

  1. 使用By.id(":pg")
  2. 或者使用By.tagname("table")并搜索id为pg的元素

这是两种情况的代码.

By.id:

WebDriver webDriver = new FirefoxDriver();
webDriver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
webDriver = webDriver.switchTo().frame("canvas_frame");
WebElement table1 = webDriver.findElement(By.id(":pg"));`
Run Code Online (Sandbox Code Playgroud)

上面的代码,我直接得到id为":pg"的元素

By.tagname:

WebDriver webDriver = new FirefoxDriver();
webDriver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
List<WebElement> tables = webDriver.findElements(By.tagName("table"));
for(WebElement table2: tables){
    String id = table2.getAttribute("id");
    System.out.println("id: "+ id);
    if(id != null && id.equals(":pg")){
        System.out.println("FOUND IT!!!");
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,我找到了所有带有tablename标签名的元素,然后查看哪个元素的id为":pg".

这两个代码片段基本上都是相同的,但使用不同的方式(By.id或By.tagname).但是,使用By.id的第一段代码总是成功,而使用By.tagname的第二段代码几乎总是失败.(但是它可以使用额外的等待)

为什么By.id和By.tagname之间存在差异?

谢谢,克里斯.

testing automation automated-tests webdriver

2
推荐指数
1
解决办法
2万
查看次数

IE驱动程序处理完毕后,IEDriverServer.exe进程仍然挂起

我正在使用Selenium的IE驱动程序进行Web测试.启动IE8并关闭它后,该IEDriverServer.exe过程不会消失.如果我再次运行测试,则会创建一个新进程并保持挂起状态.我的测试代码或Selenium设置有什么问题?

using (var driver = new InternetExplorerDriver(
    new InternetExplorerOptions() { 
        IntroduceInstabilityByIgnoringProtectedModeSettings = true }))
{
    Assert.IsTrue(true);
    driver.Close();
}
Run Code Online (Sandbox Code Playgroud)

c# selenium webdriver internet-explorer-8

2
推荐指数
1
解决办法
3455
查看次数

当我调用initElements时,@ FindBy不关心元素是否存在

例如,假设我有类FanPage,带有此注释

@FindBy(how = How.ID, using = "ctl00__lvph_Add")
private WebElement _AddFanButton;
Run Code Online (Sandbox Code Playgroud)

然后在我的测试代码中我说

fanPage = homePage.GoToFanPage()
Run Code Online (Sandbox Code Playgroud)

哪个

return PageFactory.initElements(driver, CC_VendorStatisticsMetadata.class);
Run Code Online (Sandbox Code Playgroud)

现在如果我的注释不正确(假设它应该是ctl00_lvph_AddFan),我希望我对initElements的调用失败.但是,它没有,它只是向我返回一个FanPage对象.如果我尝试使用_AddFanButton,它只会失败.

如何从一开始就让PageFactory查找我的注释?

selenium webdriver findby

2
推荐指数
1
解决办法
2579
查看次数