我需要在一些C#代码中访问本机C++ DLL中的代码,但是在查找编组时遇到了问题.我之前使用直接C的代码完成了这项工作,但似乎发现使用C++类并不是直接可行的.由于许多类包含虚函数或内联函数,因此更加复杂.我甚至尝试通过PInvoke Interop助手传递标题,但它会扼杀几乎所有内容而不是真的没有做什么...我猜是因为它不是真的支持.
那么,如果可能的话,你如何使用.NET代码中的本机C++类DLL.如果我必须使用一些中介(CLR C++?),那很好.
我正在尝试使用IronPython作为C#GUI和一些C#库之间的中介,以便它可以在编译后编写脚本.
我有一个类库DLL,由GUI和python使用,是这样的:
namespace MyLib
{
public class MyClass
{
public string Name { get; set; }
public MyClass(string name)
{
this.Name = name;
}
}
}
Run Code Online (Sandbox Code Playgroud)
IronPython代码如下:
import clr
clr.AddReferenceToFile(r"MyLib.dll")
from MyLib import MyClass
ReturnObject = MyClass("Test")
Run Code Online (Sandbox Code Playgroud)
然后,在C#中,我将其称为如下:
ScriptEngine engine = Python.CreateEngine();
ScriptScope scope = null;
scope = engine.CreateScope();
ScriptSource source = engine.CreateScriptSourceFromFile("Script.py");
source.Execute(scope);
MyClass mc = scope.GetVariable<MyClass>("ReturnObject ")
Run Code Online (Sandbox Code Playgroud)
当我调用最后一段代码时,source.Execute(scope)运行成功返回,但是当我尝试GetVariable调用时,它抛出以下异常
Microsoft.Scripting.ArgumentTypeException: expected MyClass , got MyClass
Run Code Online (Sandbox Code Playgroud)
所以,你可以看到类名完全相同,但由于某种原因,它认为它们是不同的.
DLL与.py文件位于不同的目录中(我只是没有写出所有路径设置的东西),可能是因为IronPython的解释器存在问题,因为它看起来不同,因为它是某种方式看到他们处于不同的背景或范围?
我正在尝试使用IronPython中的urllib2发送带有纯XML负载的POST消息(我认为).但是,每次我发送它时,它都会返回错误代码400(错误请求).
我实际上试图模仿一个Boxee删除队列项调用,实际数据包看起来像这样(来自WireShark):
POST /action/add HTTP/1.1
User-Agent: curl/7.16.3 (Windows build 7600; en-US; beta) boxee/0.9.21.11487
Host: app.boxee.tv
Accept: */*
Accept-Encoding: deflate, gzip
Cookie: boxee_ping_version=9; X-Mapping-oompknoc=76D730BC9E858725098BF13AEFE32EB5; boxee_app=e01e36e85d368d4112fe4d1b6587b1fd
Connection: keep-alive
Content-Type: text/xml
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Accept-Language: en-us,en;q=0.5
Keep-Alive: 300
Connection: keep-alive
Content-Length: 53
<message type="dequeue" referral="3102296"></message>
Run Code Online (Sandbox Code Playgroud)
我正在使用以下python代码发送POST:
def PostProtectedPage(theurl, username, password, postdata):
req = urllib2.Request(theurl, data=postdata)
req.add_header('Content-Type', 'text/xml')
try:
handle = urllib2.urlopen(req)
except IOError, e: # here we are assuming we fail
pass
else: # If we don't fail then the page isn't protected
print …Run Code Online (Sandbox Code Playgroud) 我正在尝试将 FSharp PowerPack 用于 ArgParser 库,但是在我的机器上遇到了一些严重的问题,它似乎从 GAC 加载了错误版本的 FSharp.Core.dll,然后导致 ArgParser 的加载失败. 理想情况下,我会解决这个问题(因为它可以在我同事的计算机上运行),但我已经尝试了从系统中卸载和重新安装 FSharp 二进制文件的各种组合都无济于事。
由于我真的不喜欢这样一个事实,即我不能因为 GAC而将已知为正确的DLL 删除在可执行目录中,如果有任何方法可以禁用在 GAC 中的搜索,我会很乐意这样做.
我知道这个解决方案有点麻烦,但现在我只需要让它加载和工作,我会尝试任何事情。
编辑
还有一些信息。这是项目的负载输出。
'PowerPackTest.exe' (Managed (v4.0.30319)): Loaded 'C:\WINNT\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'PowerPackTest.exe' (Managed (v4.0.30319)): Loaded 'C:\Projects\PowerPackTest\PowerPackTest\bin\Debug\PowerPackTest.exe', Symbols loaded.
'PowerPackTest.exe' (Managed (v4.0.30319)): Loaded 'C:\WINNT\Microsoft.Net\assembly\GAC_MSIL\FSharp.Core\v4.0_4.0.0.0__b03f5f7f11d50a3a\FSharp.Core.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'PowerPackTest.exe' (Managed (v4.0.30319)): Loaded 'C:\WINNT\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll', Skipped loading symbols. Module …Run Code Online (Sandbox Code Playgroud) 我正在尝试从系统托盘中读取不属于我自己的应用程序的ToolTip文本.基本上我认为最简单的方法是获取一些状态信息.
使用C#提取ToolTip文本最简单的方法是什么?
我正在尝试在同一网络上的多台计算机和一台服务器之间实现一些跨进程通信.我现在正在尝试的是使用WCF和NetTcpBinding,我的应用程序托管在同一台机器上,但是当我尝试从另一台机器连接时,它会抛出SSPI安全错误.
我发现了很多这样的跨机器的例子,但都涉及到app.config文件,我真的很想避免.我希望能够将此功能嵌入到没有其他依赖项(即配置文件)的DLL中,我可以将其传递给所有必需的服务器地址等,它将起作用.无论如何,仅仅在代码中设置此安全性(通过端点等)?
我正在用以下代码测试这一切:
服务器:
using System;
using System.ServiceModel;
namespace WCFServer
{
[ServiceContract]
public interface IStringReverser
{
[OperationContract]
string ReverseString(string value);
}
public class StringReverser : IStringReverser
{
public string ReverseString(string value)
{
char[] retVal = value.ToCharArray();
int idx = 0;
for (int i = value.Length - 1; i >= 0; i--)
retVal[idx++] = value[i];
string result = new string(retVal);
Console.WriteLine(value + " -> " + result);
return result;
}
}
class Program
{
static void Main(string[] args)
{
var uri …Run Code Online (Sandbox Code Playgroud) 我正在试图弄清楚要使用的数据类型......基本上我想要一个线程安全的FIFO队列,并且一旦达到预先指定的限制就会自动抛出足够多的数据.
嗯,实际上,也许更多的是列表,因为我不希望整个概念推入队列并从队列中弹出一个项目,此时它已不再可用.
用例基本上是一个播放列表,我最多有5个即将到来的项目,当前正在播放的项目,然后是大约20个已播放的项目.因此,为什么我猜它不能是一个队列,我将访问中间的一个项目作为"当前"项目.当列表变得很大时,我宁愿不必手动管理丢弃旧物品......显然我可以自己写这些,但如果C#已经存在,我不想重新发明轮子.
我能用什么的想法?
我有一个WPF PopUp控件,我用来显示菜单覆盖,我正在使用默认的淡入淡出动画.但是我想让动画花费更长的时间才能完成.
无论如何我可以在XAML中做到这一点吗?
我正在尝试使用PyAudio在Windows,Mac和Linux上捕获系统输出音频,但结果好坏参半.现在我这样做:
self.p = pyaudio.PyAudio()
self.inStream = self.p.open(format=pyaudio.paInt16,channels=1,rate=self.RATE,input=True, output=False,frames_per_buffer=self.BUFFERSIZE)
Run Code Online (Sandbox Code Playgroud)
然后从inStream中读取.
但是,在Ubuntu上,它非常不稳定.工作了一段时间,但也拿起麦克风.然后我连接了我的耳机,因为它没有拾起任何东西.
在Windows上,它只会接听线路或麦克风,所以我能让它工作的唯一方法是将耳机输出路由回到线路中.
另外,我尝试使用input = False,output = True,它只是告诉我没有输出设备.
有没有更好的方法呢?有没有办法选择默认设备?我只是想让它接收扬声器发出的任何声音.
有谁知道将在Windows Mobile上运行的OCR库(5或6,但PPC2003SE会很棒)?
我认为OCR将是本机(C/C++)代码,但如果它是在.NET中或者至少有一个.NET包装器API,那就太棒了.