我试图做这样的事情这在C#.我发现如何使用此链接中的 P/Invoke 从 C#调用Win32方法.但是我在实现P/Invoke方面遇到了一些困难.
例如,我想访问的方法之一是PdhOpenQuery,签名:
PDH_STATUS PdhOpenQuery(
__in LPCTSTR szDataSource,
__in DWORD_PTR dwUserData,
__out PDH_HQUERY *phQuery
);
Run Code Online (Sandbox Code Playgroud)
我认为相应的C#声明应该是这样的
[DllImport("Pdh.dll")]
static extern PDH_STATUS PdhOpenQuery(LPCTSTR szDataSource,
DWORD_PTR dwUserData, out PDH_HQUERY *phQuery);
Run Code Online (Sandbox Code Playgroud)
我的问题:
什么是LPCTSTR,以及它在C#中映射的数据类型是什么?
如何映射指针类型DWORD_PTR?pinvoke文章说DWORD映射到UInt32,但指针怎么样?
我认为PDH_STATUS和PDH_HQUERY是库的特定结构(我还不确定).我该如何映射这些?
什么是正确的方法声明,以及如何正确地调用它?
是否可以为以下文件的输出指定不同的文件夹?
<Content Include="test.stl">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
Run Code Online (Sandbox Code Playgroud) 如何使用C#中的退出代码退出程序?在java中它会System.exit(int code);
在调试模式下,如果我将鼠标悬停在谓词上,我看到的只是一些类型名称和一些不可理解的符号.这使得调试代码变得非常困难,例如知道某个变量所持有的谓词.我通常使用lambda表达式分配这个谓词值.有没有办法知道谓词包含什么?
例如,如果我有Predicate<object> myPred变量或List<Predicate<object>> predList变量,我如何调试myPred的值或者运行时包含的predList?
我知道我可以用%0得到第一个参数,用%1得到第二个,依此类推.我也可以用%*获得所有参数.
我可以从第二个参数得到所有参数吗?例如,如果我跑
foo.bat bar1 bar2 bar3 bar4
Run Code Online (Sandbox Code Playgroud)
我怎么才能得到bar2 bar3 bar4?
我一直在我的程序中得到这个例外.我怎么知道哪个进程锁定了它,无论是通过程序代码还是通过Windows做某事?
System.IO.IOException : The process cannot access the file 'file.ext' because it is being used by another process.
如何知道参数的数量和类型?
怎么知道返回类型?
如何检查返回类型是否为空?
如何从C#中的字符串中获取字节数组?我想将一个字符串传递给这个方法.
我正在实现一个需要实现BeginDoSomething和EndDoSomething方法的接口.然而,我DoSomething并不是真的长期奔跑.为简单起见,假设DoSomething只比较两个变量并返回是否a> b
所以我的BeginDoSomething应该是这样的:
protected override IAsyncResult BeginDoSomething(int a, int b, AsyncCallback callback, object state)
{
bool returnValue = a > b;
return ...; //what should I return here?
//The method actually already completed and I don't need to wait for anything
}
Run Code Online (Sandbox Code Playgroud)
我不知道应该归还什么.我只是实现,BeginDoSomething因为我必须,而不是因为我的方法是长期运行.我需要实现自己的IAsyncResult吗?.NET库中是否已有实现?
我正在创建一个WCF服务器 - 客户端应用程序.但是,在我的第一次测试中,一个简单的调用(该方法基本上只return true;需要)需要很多时间(~5秒)
我试图追踪它,这是一个呼叫追踪的截图

你可以看到第2行和第3行之间的时间是5秒(虽然老实说我不知道第2行和第3行是什么意思)
在客户端(调用者)配置中,绑定是这样的(主要由Visual Studio生成)
<wsHttpBinding>
<binding name="WSHttpBinding_IAgent" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text"
textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<reliableSession ordered="true" inactivityTimeout="00:10:00"
enabled="false" />
<security mode="None">
</security>
</binding>
</wsHttpBinding>
Run Code Online (Sandbox Code Playgroud)
并在服务器上
<wsHttpBinding>
<binding name="WSHttpBinding_IAgent" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:05:00" sendTimeout="00:05:00"
bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
maxBufferPoolSize="16777216" maxReceivedMessageSize="16777216"
messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
allowCookies="false">
<readerQuotas maxDepth="32" maxStringContentLength="16777216"
maxArrayLength="16384" maxBytesPerRead="16384" maxNameTableCharCount="16384" />
<reliableSession ordered="true" inactivityTimeout="00:10:00"
enabled="false" />
<security mode="None"/>
</binding>
Run Code Online (Sandbox Code Playgroud)
我称之为这样的方式
var client = new …Run Code Online (Sandbox Code Playgroud) .net ×6
c# ×6
debugging ×2
windows ×2
asynchronous ×1
batch-file ×1
byte ×1
bytearray ×1
cryptography ×1
delegates ×1
exit ×1
exit-code ×1
file-access ×1
iasyncresult ×1
lambda ×1
msbuild ×1
pinvoke ×1
predicates ×1
reflection ×1
soap ×1
string ×1
void ×1
wcf ×1
winapi ×1