小编Jim*_*ans的帖子

我可以在RealProxy实例中使用反射吗?

我很确定我在某个地方缺少一些约束或警告,但这是我的情况.假设我有一个我想拥有代理的类,如下所示:

public class MyList : MarshalByRefObject, IList<string>
{
    private List<string> innerList;

    public MyList(IEnumerable<string> stringList)
    {
        this.innerList = new List<string>(stringList);
    }

    // IList<string> implementation omitted for brevity.
    // For the sake of this exercise, assume each method
    // implementation merely passes through to the associated
    // method on the innerList member variable.
}
Run Code Online (Sandbox Code Playgroud)

我想为该类创建一个代理,以便我可以拦截方法调用并对底层对象执行一些处理.这是我的实现:

public class MyListProxy : RealProxy
{
    private MyList actualList;

    private MyListProxy(Type typeToProxy, IEnumerable<string> stringList)
        : base(typeToProxy)
    {
        this.actualList = new MyList(stringList);
    }

    public static object CreateProxy(IEnumerable<string> stringList) …
Run Code Online (Sandbox Code Playgroud)

c# reflection clr proxy-classes

26
推荐指数
2
解决办法
1446
查看次数

如何在没有Visual Studio的系统上编译.NET 3.5 C#代码?

我有一些C#代码使用一些特定于.NET 3.5的构造.安装.NET Framework发行版时,可以使用它安装C#编译器(csc.exe).即使我在C:\ Windows\Microsoft.NET\Framework\v3.5中指定了csc.exe,我也无法在安装了.NET Framework但不安装Visual Studio 的计算机上编译代码.我能够毫无困难地编译使用v2.0构造的代码.我怎么能做到这一点?

这是一个演示我的问题的示例:

using System;
class Program
{
    public static void Main()
    {
        // The MacOSX value to the PlatformID enum was added after
        // .NET v2.0
        if (Environment.OSVersion.Platform == PlatformID.MacOSX)
        {
            Console.WriteLine("Found mac");
        }
        Console.WriteLine("Simple program");
    }
}
Run Code Online (Sandbox Code Playgroud)

使用csc.exe编译此代码时,我收到以下错误:

test.cs(9,58):错误CS0117:'System.PlatformID'不包含'MacOSX'的定义

执行时csc.exe /?我收到横幅:

Microsoft(R)Visual C#2008编译器版本3.5.21022.8(
适用于Microsoft(R).NET Framework版本3.5)
版权所有(C)Microsoft Corporation.版权所有.

c# .net-3.5

13
推荐指数
1
解决办法
6114
查看次数

如何在C++中调用IE中的eval()?

随着IE11的出现,IHTMLWindow2::execScript()不推荐使用.推荐的方法是使用eval()代替.我通过其C++ COM接口自动化IE,我一直无法找到如何实现这一点.有人能指出我在搜索中明显错过的例子吗?如果无法执行代码eval,那么将JavaScript代码注入到现在execScript不再可用的Internet Explorer实例中的适当方法是什么?

编辑:任何适用于我正在进行的项目的解决方案必须在进程外工作.我没有使用浏览器助手对象(BHO)或任何类型的IE插件.因此,任何涉及无法正确编组交叉过程的接口的解决方案都不适用于我.

c++ com internet-explorer

13
推荐指数
1
解决办法
5723
查看次数

如何从C#确定性地处理托管C++/CLI对象?

我在C++/CLI程序集中有一个托管对象.作为C++/CLI,它通过"析构函数"实现Disposable模式(是的,我知道它与标准C++析构函数不同).从C++/CLI,我只是delete对象.但是,我将此对象用作C#类中的成员变量.

从我的C#类开始,当我使用它时,我想调用C++/CLI对象上的Dispose()方法的等效方法.由于它是(并且必须是)类的成员变量,因此使用using()块是不可能的.据我所知,没有公开的方法可以直接,确定地处理来自C++/CLI之外的语言的资源.我怎么能做到这一点?

c# interop c++-cli

12
推荐指数
2
解决办法
5108
查看次数

如何在C++的Internet Explorer中创建JavaScript对象

我正在使用外部C++应用程序来控制Internet Explorer(版本为11,但这对于此示例似乎并不重要).该控件的一部分是能够在浏览器的上下文中运行任意JavaScript.为了启用该控件,我希望能够创建一个JavaScript对象(或数组,或函数等),由适当的IDispatch变体表示,我可以在后续的脚本调用中使用.有一些在线示例,包括一些来自Microsoft的示例,通过查找和调用Object构造函数来表明这样的事情应该是可能的.

下面是一些示例代码,从前面提到的示例中得到证实,应该可以解决这个问题.但是,当我执行代码时,我得到一个E_INVALIDARG("一个或多个参数无效")HRESULT返回.我做错了什么,我该如何解决这个问题?

// Example assumes that you're using an ATL project which give access to
// the "CCom" wrapper classes, and that you have the ability to retrieve
// an IHTMLDocument2 object pointer.
int CreateJavaScriptObject(IHTMLDocument2* script_engine_host, CComVariant* created_object) {
  // NOTE: Proper return code checking and error handling
  // has been omitted for brevity
  int status_code = 0;
  CComPtr<IDispatch> script_dispatch;
  HRESULT hr = script_engine_host->get_Script(&script_dispatch);
  CComPtr<IDispatchEx> script_engine;
  hr = …
Run Code Online (Sandbox Code Playgroud)

c++ com internet-explorer

6
推荐指数
0
解决办法
308
查看次数

如何在 C# 应用程序中使用 C++ 类而不考虑平台?

我有一个本机/非托管 C++ 库,其中包含许多我想从 C# 使用的类。我读过的大多数解决方案(比如这个这个)都建议我应该创建一个 C++/CLI 包装器,并在我的 C# 项目中使用这个包装器。然而,这些建议中的大多数都忽略了平台。据我所知,如果非托管 DLL 是 32 位,我的包装 DLL 必须是 32 位,这将强制我的 C# 项目使用 x86 平台,即使我同时拥有 32 位和 64 位可用的非托管 DLL 的位版本。

我之前通过使用带有LoadLibrary()和的P/Invoke 使用 C API 解决了这个问题Marshal.GetDelegateForFunctionPointer(),但我认为包装 C++ 对象的每个方法调用将容易出错且难以维护。我也不认为我应该尝试依赖于发现 C++ DLL 中导出的损坏名称。

顺便说一句,我尝试使用的 C++ 库是 Google V8 JavaScript VM ( http://code.google.com/p/v8/ ),它可以为 x86 或 x64 编译,因此将 C++ 源代码直接移植到C# 是不可能的。是的,我知道有几个现有项目包装了 V8 以与托管代码一起使用,例如 v8sharp ( http://v8sharp.codeplex.com/ ) 和 Javascript .NET ( http://javascriptdotnet.codeplex.com/)。但是,据我所知,它们都使用特定于平台的 C++/CLI 包装器。为了与其他托管代码库互操作,我需要我的托管代码组件才能使用 AnyCPU。

有没有好的方法来实现这一点?

c# c++ interop 32bit-64bit

5
推荐指数
1
解决办法
689
查看次数

在Selenium中,"等到页面加载停止"的命令是什么

如何使WebDriver等到页面加载完全停止.

意味着,它等待并检查整个页面是否已加载,然后只进行下一行执行.

selenium webdriver selenium-webdriver

5
推荐指数
2
解决办法
3500
查看次数

如何正确关闭持久的 System.Net.WebSockets.ClientWebSocket 连接?

我正在System.Net.WebSockets.ClientWebSocket创建一个 C# WebSocket 客户端来连接到服务器,但我不拥有该服务器的源代码。到目前为止一切正常,但我希望“正确”断开我的客户端。这是我的源代码的缩写版本:

public class Client : IDisposable
{
    private ClientWebSocket socket;
    private string endpoint;
    private Task receiveTask;

    public Client(string endpoint)
    {
        this.endpoint = endpoint;
        this.socket = new ClientWebSocket();
    }

    public async Task Initialize()
    {
        byte[] contentBuffer = Encoding.UTF8.GetBytes("notify message");

        // Connect to the server, and send a message to notify
        // it of the client's availability to receive data.
        await OpenConnection();
        await socket.SendAsync(new ArraySegment<byte>(contentBuffer), WebSocketMessageType.Text, true, CancellationToken.None);
    }

    private async Task OpenConnection()
    {
        if (socket.State != …
Run Code Online (Sandbox Code Playgroud)

c# websocket task-parallel-library

5
推荐指数
1
解决办法
3732
查看次数

是否有更好的方法在C++中执行URL模式匹配而不是迭代?

我有一个模式匹配例程,它根据用于请求命令的URL从std :: map查找值.URL映射表填充了以下值:

// Assume this->commands_ is defined elsewhere as std::map<std::string, int>
// Providing a number of URL examples to give an idea of the structure of
// the URLs
this->commands_["/session"] = 1;
this->commands_["/session/:sessionid/url"] = 2;
this->commands_["/session/:sessionid/back"] = 3;
this->commands_["/session/:sessionid/forward"] = 4;
this->commands_["/session/:sessionid/element"] = 5;
this->commands_["/session/:sessionid/element/:id/text"] = 6;
this->commands_["/session/:sessionid/element/:id/value"] = 7;
Run Code Online (Sandbox Code Playgroud)

每个URL模式中的标记(由前面的':'指定)被查找例程的调用中的实际值替换(例如"/session/1234-8a0f/element/5bed-6789/text"),但是我将需要保留的命名参数.上例中的命名标记列表并非详尽无遗,并且上面列出的位置可能还有其他命名标记.请注意,令牌值是十六进制编码的数字.

目前,我正在迭代映射的键,用正则表达式值替换替换标记,并使用std :: tr1正则表达式类对请求的值执行正则表达式匹配,将匹配的标记名称和值捕获到向量中.代码在功能上与此等效(代码比通常为清晰起见而更冗长):

// Assume "using namespace std;" has been declared,
// and appropriate headers #included.
int Server::LookupCommand(const string& uri,
                          vector<string>* names,
                          vector<string>* values) {
    int …
Run Code Online (Sandbox Code Playgroud)

c++ regex tr1 pattern-matching

4
推荐指数
1
解决办法
809
查看次数

为什么FxCop坚持使用IDisposable作为结构

我的一个项目中的代码类似于以下代码:

internal enum ArtworkType
{
    Undefined = 0,
    Bmp = 1,
    Gif = 2,
    Jpeg = 3,
    Png = 4
}

[StructLayout(LayoutKind.Sequential)]
internal struct TagArtwork
{
    internal IntPtr data;
    internal int size;
    internal ArtworkType type;
}
Run Code Online (Sandbox Code Playgroud)

当我在这段代码上运行FxCop时,我会遇到警告CA1049.此结构用于与本机代码库的互操作性,因此它几乎必须具有此布局.为什么FxCop让我对这个结构感到悲伤?我在同一个源文件中有其他结构,也有IntPtr成员,但FxCop不抱怨这些.

例如,下面的代码并没有引发同样的警告:

internal enum ItemType
{
    Implicit = 0,
    Utf8 = 1,
    Utf16 = 2,
    Sjis = 3,
    Html = 6,
    Xml = 7,
    Uuid = 8,
    Isrc = 9,
    Mi3p = 10,
    Gif = 12, …
Run Code Online (Sandbox Code Playgroud)

c# fxcop

4
推荐指数
1
解决办法
408
查看次数