我很确定我在某个地方缺少一些约束或警告,但这是我的情况.假设我有一个我想拥有代理的类,如下所示:
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#代码使用一些特定于.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.版权所有.
随着IE11的出现,IHTMLWindow2::execScript()不推荐使用.推荐的方法是使用eval()代替.我通过其C++ COM接口自动化IE,我一直无法找到如何实现这一点.有人能指出我在搜索中明显错过的例子吗?如果无法执行代码eval,那么将JavaScript代码注入到现在execScript不再可用的Internet Explorer实例中的适当方法是什么?
编辑:任何适用于我正在进行的项目的解决方案必须在进程外工作.我没有使用浏览器助手对象(BHO)或任何类型的IE插件.因此,任何涉及无法正确编组交叉过程的接口的解决方案都不适用于我.
我在C++/CLI程序集中有一个托管对象.作为C++/CLI,它通过"析构函数"实现Disposable模式(是的,我知道它与标准C++析构函数不同).从C++/CLI,我只是delete对象.但是,我将此对象用作C#类中的成员变量.
从我的C#类开始,当我使用它时,我想调用C++/CLI对象上的Dispose()方法的等效方法.由于它是(并且必须是)类的成员变量,因此使用using()块是不可能的.据我所知,没有公开的方法可以直接,确定地处理来自C++/CLI之外的语言的资源.我怎么能做到这一点?
我正在使用外部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++ 库,其中包含许多我想从 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。
有没有好的方法来实现这一点?
如何使WebDriver等到页面加载完全停止.
意味着,它等待并检查整个页面是否已加载,然后只进行下一行执行.
我正在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) 我有一个模式匹配例程,它根据用于请求命令的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) 我的一个项目中的代码类似于以下代码:
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)