标签: managed

对PInvoke函数'[...]'的调用使堆栈失衡

对于我已经使用了很长一段时间的一些东西,我得到了这个奇怪的错误.它可能是Visual Studio 2010中的新东西,但我不确定.
我试图用C#调用用C++编写的无人函数.
从我在互联网上阅读的内容和错误信息本身来看,这与我的C#文件中的签名与C++中的签名不同但我真的看不到它这一事实有关.
首先,这是我在下面的无人函数:

TEngine GCreateEngine(int width,int height,int depth,int deviceType);
Run Code Online (Sandbox Code Playgroud)

这是我在C#中的功能:

[DllImport("Engine.dll", EntryPoint = "GCreateEngine", CallingConvention = CallingConvention.StdCall)]  
        public static extern IntPtr CreateEngine(int width,int height,int depth,int device);
Run Code Online (Sandbox Code Playgroud)

当我调试到C++时,我看到所有的参数都很好,因此我只能认为它与从TEngine(这是一个名为CEngine的类的指针)转换为IntPtr有关.我之前在VS2008中使用过这个没问题.

c# c++ pinvoke unmanaged managed

45
推荐指数
4
解决办法
4万
查看次数

WinApi - GetLastError与Marshal.GetLastWin32Error

我测试了很多.但我发现那些2没有缺点!
但是看到接受的答案.


在这里读到,调用GetLastError托管代码是不安全的,因为框架可能在内部"覆盖"最后一个错误.我从来没有遇到任何明显的问题,GetLastError对我来说,.NET Framework足够智能,不会覆盖它.因此,我对该主题有几个问题:

  • in [DllImport("kernel32.dll", SetLastError = true)]SetLastError属性是否使Framework存储错误代码供使用Marshal.GetLastWin32Error()
  • 是否有一个例子,普通GetLastError无法给出正确的结果?
  • 真的必须使用Marshal.GetLastWin32Error()吗?
  • 这个"问题"框架版本是否相关?

public class ForceFailure
{
    [DllImport("kernel32.dll")]
    static extern uint GetLastError();
    [DllImport("kernel32.dll", SetLastError = true)]
    static extern bool SetVolumeLabel(string lpRootPathName, string lpVolumeName);

    public static void Main()
    {
        if (SetVolumeLabel("XYZ:\\", "My Imaginary Drive "))
            System.Console.WriteLine("It worked???");
        else
        {
            // the first last error check is fine here:
            System.Console.WriteLine(GetLastError());
            System.Console.WriteLine(Marshal.GetLastWin32Error());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


产生错误: …

c# winapi unmanaged managed marshalling

45
推荐指数
3
解决办法
5万
查看次数

C++/CLI:从非托管枚举转换为托管枚举

从本机代码enum转换为enum包含相同enum值的托管代码的正确方法(在C++/CLI中)是什么?使用C#方式进行(int)编译是否有任何区别,例如在C++/CLI中.

enums casting native c++-cli managed

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

如何在托管C++中使用typeof(int)?

我现在正在开发一个项目,其中一部分使用托管C++.在托管C++代码中,我正在创建一个DataTable.在为数据表定义列时,我需要指定列的类型.在C#中,那会:

typeof运算(INT)

但是我如何在托管C++中做到这一点?

谢谢!

c# c++-cli managed

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

如何防止我的代码被盗?

当我启动.NET exe时会发生什么?我知道C#被编译为IL代码,我认为生成的exe文件只是启动运行时并将IL代码传递给它的启动器.但是怎么样?它的过程有多复杂?

IL代码嵌入在exe中.我认为它可以从内存中执行而不将其写入磁盘,而普通的exe不是(好的,是的,但它非常复杂).

我的最终目标是提取IL代码并编写我自己的加密启动器,以防止scriptkiddies在Reflector中打开我的代码并轻松窃取我的所有类.好吧,我无法完全阻止逆向工程.如果他们能够检查内存并抓住我将纯IL传递给运行时的那一刻,那么无论是否是.net exe都没关系,是吗?我知道有几个混淆器工具,但我不想弄乱IL代码本身.

编辑:所以似乎不值得尝试我想要的.无论如何他们都会破解它...所以我会寻找一个混淆工具.是的,我的朋友也说,将所有符号重命名为无意义的名称就足够了.毕竟逆向工程并不那么容易.

.net c# cil reverse-engineering managed

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

托管和非托管应用内产品android之间的区别?

我通过开发人员论坛了解托管非托管应用内产品之间的区别.他们说"未管理的商品没有将他们的交易信息存储在Android Market上,这意味着您无法查询Android Market以检索购买类型被列为非托管的商品的交易信息.您有责任管理交易信息.非托管物品." 这是什么意思?当我测试托管和非托管的应用内商品时,我从服务器获得了正确的响应,在我的商家帐户中,托管和非托管应用的订单也变得明显.请帮我了解这两者之间的区别.

android unmanaged managed in-app-purchase

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

非托管内存和托管内存

究竟是什么un-managedmanaged memory?任何人都能简单解释一下吗?

此外,当托管内存概念被用于RAM,调用托管RAM时,究竟意味着什么.有关"托管RAM"和"非托管RAM"的具体细节是什么?

memory ram unmanaged managed

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

如何实现从非托管DLL到.net应用程序的回调接口?

在我的下一个项目中,我想为C++中已有的代码实现GUI.我的计划是将C++部分包装在DLL中并在C#中实现GUI.我的问题是我不知道如何实现从非托管DLL到manged C#代码的回调.我已经在C#中做了一些开发,但是托管和非托管代码之间的接口对我来说是新的.任何人都可以给我一些提示或阅读提示或一个简单的例子来开始吗?不幸的是,我找不到任何有用的东西.

c# c++ unmanaged managed callback

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

在"托管到原生过渡"期间究竟发生了什么?

我知道CLR需要在某些情况下进行编组,但是让我说我​​有:

using System.Runtime.InteropServices;
using System.Security;

[SuppressUnmanagedCodeSecurity]
static class Program
{
    [DllImport("kernel32.dll", SetLastError = false)]
    static extern int GetVersion();

    static void Main()
    {
        for (; ; )
            GetVersion();
    }
}
Run Code Online (Sandbox Code Playgroud)

当我用调试器进入这个程序时,我总是看到:

鉴于没有需要完成的编组(对吗?),有人可以解释一下这种"托管到本地的过渡"中实际发生了什么,以及为什么有必要?

.net c# pinvoke unmanaged managed

22
推荐指数
3
解决办法
4846
查看次数

ODP.NET Oracle.ManagedDataAcess随机ORA-12570错误

我正在尝试从非托管版本迁移到Oracle.ManagedDataAcess并接收randoms ORA-12570 TNS:数据包读取器故障.

我不知道为什么会出现这个错误,但是一旦它开始,每个后续请求都会给出相同的错误大约10-30分钟,然后它会再次运行10-30分钟,依此类推.

因此,随后的失败随机失败一段时间,随后成功

已经尝试过很多东西,要恢复:

环境:

  • Oracle.ManagedDataAcess版本12.1.2400(4.121.2.20150926)(nuget)(服务器上没有安装可以覆盖bin版本的gac引用)
  • Oracle Server Oracle Database 12c企业版12.1.0.2.0版 - 64位生产
  • Windows 2012(Windows Update确定)

经过:

  • 防火墙:这不是防火墙问题
  • 计算机错误:我的计算机,Azure WebApp和AWS EC2实例上也出现同样的问题
  • 干扰:没有嗅探器运行,透明代理等.
  • 加密:我不使用任何类型的加密(除非默认启用某些我不知道的东西)
  • 连接字符串:相同的连接字符串与非托管版本完美配合

附加信息:

  • 这是一个生产数据库,它非常稳定
  • 应用程序编译为anycpu,IIS应用程序池限制为64位
  • 我每次测试完全相同的请求(只是刷新其余的ws,webapi),所以它与数据格式无关

组态:

服务器sqlnet.ora

SQLNET.AUTHENTICATION_SERVICES= (NTS)
NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)

应用程序Web.config

<connectionStrings>
<add name="XXXX" connectionString="Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=xxx.xxx.com)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=xxx)));User Id=xxxxx;Password=xxxxx;" />
</connectionStrings>

<configSections>
    <section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
</configSections>

<oracle.manageddataaccess.client>
    <version number="*">
      <dataSources>
        <!--<dataSource alias="SampleDataSource" descriptor="(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL))) " />-->
      </dataSources>
      <settings>
        <setting name="SQLNET.AUTHENTICATION_SERVICES" value="NONE"/> <!--NTS-->
        <setting name="sqlnet.crypto_checksum_server" value="rejected"/>
        <setting name="sqlnet.crypto_checksum_client" value="rejected"/>
        <setting name="SQLNET.ENCRYPTION_SERVER" value="rejected"/> …
Run Code Online (Sandbox Code Playgroud)

c# oracle managed odp.net oracle12c

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