标签: mixed-mode

Visual Studio:std::string 的乱码调试监视?

当我在 Visual Studio 2005 中调试 C++ 混合(托管/非托管)项目时,我经常从调试监视中获得奇怪的数据,如下所示:(
顺便说一句,变量i_processName是 a const std::string &

替代文字 http://img175.imageshack.us/img175/3561/43419953av1.jpg

请注意,该变量实际上包含有效数据 - 如果我将其打印到标准输出,则打印的字符串就好了,感谢您的询问。较简单的数据类型(例如ints)(通常?)显示其正确值。

你也遇到过这种情况吗?

这是调试时的一个主要 PITA,所以......关于如何让手表显示正确数据的任何想法,或者是什么导致了这种情况?

c++ debugging mixed-mode visual-studio

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

任何cpu和x64之间的托管代码引用

我有一个混合模式C++/CLI项目,编译为x86和x64冻结dll.

我有一个需要使用这个项目的C#应用​​程序,编译为"任何CPU".如何从c#app正确引用正确的dll?如果我右键单击添加引用,我必须只选择2个dll中的一个.
我的"任何CPU"C#应用程序有时会运行为x64,有时运行为x86进程.

我听说你可以通过智能配置文件来做到这一点.

.net c# mixed-mode c++-cli

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

如何将托管对象发送到本机函数以使用它?

如何将托管对象发送到本机函数以使用它?

void managed_function()
{
  Object^ obj = gcnew Object();

  void* ptr = obj ??? // How to convert Managed object to void*?

  unmanaged_function(ptr);
}

// The parameter type should be void* and I can not change the type.
// This function is native but it uses managed object. Because type of ptr could not be 
// Object^ I called it "Unmanaged Function".
void unmanaged_function(void* ptr)
{
  Object^ obj = ptr ??? // How to convert void* to Managed object?

  obj->SomeManagedMethods(); …
Run Code Online (Sandbox Code Playgroud)

.net mixed-mode unmanaged c++-cli managed

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

从C++访问汇编语言

这是我的编程任务.我需要使用8086编程语言编写的方法找出整数数组中最大的.这是我的尝试:

  #include <iostream.h>
    #include <conio.h>

    int returnLargest(int a[])
    {
        int max;
        asm mov si,offset a

        for(int i=0;i<6;i++) //Assuming six numbers in the array...Can be set to a variable 'n' later
        {
              asm mov ax,[si]
              asm mov max,ax
              asm inc si
              cout<<max<<"\n";    //Just to see what is there in the memory location
        }

        asm mov si,offset a
        asm mov cx,0000h

        asm  mov dx, [si]

            asm mov cx,06h

        skip: asm   mov si,offset a
        asm mov bx,[si]
        asm        mov max,bx
        asm inc si …
Run Code Online (Sandbox Code Playgroud)

c++ memory assembly mixed-mode

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

unmanaged var作为托管类c ++的成员

我是.net c ++的新手,并试图创建类看起来像:

public ref class Klient
{
public:
    Klient(){}
    // zmienne
    static DWORD klienty[41][2];
    static int i = 1;
    static DWORD* pid;
    static HANDLE* handle;

    //funkcje
};
Run Code Online (Sandbox Code Playgroud)

但是MSV说:

error C4368: cannot define 'klienty' as a member of managed 'Klient': mixed types are not supported
Run Code Online (Sandbox Code Playgroud)

这段代码出了什么问题?

mixed-mode c++-cli class declaration

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

.NET 应用程序加载混合 dll,使用任何 CPU

我是创建 .NET 应用程序的新手,尤其是混合应用程序。

最近,我在(非托管)C++(在 MS Visual Studio 2010 下)中为客户端创建了一组(静态)库,支持 32 位和 64 位编译,由某些应用程序加载,通常很好. (在内部,此功能使用各种其他第三方库,如 OpenGL、boost、glm 等)

现在,他还希望能够在他的 C# 应用程序中使用我作为自定义控件提供的一些功能。

所以我创建了一个支持 CLR 的 dll,使用 C++/CLI 为我的功能创建包装类,然后创建一个自定义的 WPF 控件,它是公共的(因此可以从外部访问),再次在两者中构建都可以正常工作32 位和 64 位。

然后为了测试,我创建了一个简单的 C# 应用程序(它真的很简单,因为我是 C# 新手,我的背景是 C/C++),它可以内置 32 位或 64 位,并且可以成功地从我的 DLL 加载控件并做它应该做的事情。

我现在遇到的问题是,他说他只想将单个可执行文件作为“任何 CPU”分发,然后根据启动位置加载适当的代码(即 32 位或 64 位)。

所以我所做的是在 C# 测试项目中添加一个“Any CPU”配置,并将“build”选项卡下的“platform target”设置为“Any CPU”。但现在我不确定在配置管理器下为其他项目设置什么平台(即 C++ 静态库,由 C++/CLI 混合模式 dll 使用)。所以为了测试我把它留在 x64 上,但是当我构建它时,我收到警告:

Warning MSB3270: There was a mismatch between the processor architecture of the project being built "MSIL" and the …
Run Code Online (Sandbox Code Playgroud)

.net mixed-mode anycpu

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

C++/CLI:#pragma 托管/非托管范围

我有一个混合模式 DLL,其中有一个包含托管和非托管代码的 .cpp 文件。一个简化的重现示例如下所示:

#include "stdafx.h"
#pragma managed // Just for explicitness (doesn't influence results)
#include <msclr\marshal.h>

void Test()
{
    System::String^ sName = "";
    msclr::interop::marshal_context context;
    context.marshal_as<const TCHAR*>(sName);
}

//#pragma unmanaged // uncomment this line to get errors
Run Code Online (Sandbox Code Playgroud)

此代码编译成功,但是如果我取消注释最后一行 ( #pragma unmanaged),则会产生以下错误:

2>  Test.cpp
2>C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\msclr\marshal.h(48): error C3280: 'msclr::interop::marshal_context::internal_marshaler<_To_Type,_From_Type,_Needs_Context>::internal_marshaler' : a member-function of a managed type cannot be compiled as an unmanaged function
2>          with
2>          [
2>              _To_Type=const wchar_t *,
2>              _From_Type=System::String ^,
2> …
Run Code Online (Sandbox Code Playgroud)

.net clr pinvoke mixed-mode c++-cli

5
推荐指数
0
解决办法
1584
查看次数

useLegacyV2RuntimeActivationPolicy="true" 不适用于 .NET 4.5

此处的最佳答案:“useLegacyV2RuntimeActivationPolicy”在 .NET 4 配置中有什么作用?以及在 .NET 4.0 项目中引用 .NET 2.0 混合模式程序集需要什么“附加配置”?没有帮助。

我的特定用例是 .Net 4.5 及更高版本的 WinForms 和控制台应用程序VS2015,同时尝试使用.net 2.0 dll

在 VS2015 下,将这个的建议变体添加到项目配置文件没有帮助。

<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0"/>
  </startup>
</configuration>
Run Code Online (Sandbox Code Playgroud)

编辑:

.net 2.0 库依赖于外部的非 dotnet dll。

在 .net 4.0 客户端模式和 .net 4.0 Full 模式下,它按预期工作。

但是对于 .net 4.5 及更高版本,即使应用程序启动,该库中的功能也会停止工作。

.net dll mixed-mode .net-4.5

5
推荐指数
0
解决办法
2247
查看次数

C3859:超出了PCH的虚拟内存范围

我不时(并非每次)都收到此错误消息,我在混合模式项目中进行了编译(编辑:对不起,我在这里并没有明确指出:我的意思是“重建”)。而且Visual Studio告诉我“使用'-Zm114'或更高版本的命令行选项重新编译”。原则上没问题,我只是按照VS告诉我的那样做。

但是目前,这有两个问题:

  1. 为什么在每次重建时不会发生?如果我理解正确,则编译器在编译项目时会耗尽内存。因此,如果我进行重建以清理所有先前的工作,如果我什么都没做,它下次是否也不会耗尽内存?

  2. 为了安全起见,我已经Zm120在该项目的所有配置中为Zm(即)指定了120的值。为什么我收到一个错误消息,该值较低?还是114的建议值只是对VS的疯狂猜测?

c++ mixed-mode compiler-errors precompiled-headers visual-studio-2015

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

将std :: time_t转换为System :: DateTime的标准符合方式?

我已经找到了几个与转换std::time_t值相关的答案System::DateTime.但是,几乎所有答案似乎都忽略std::time_t了标准中实际上未定义的类型.大多数解决方案只是投射std::time_t到任何需要的或将算术运算应用于一个std::time_t可能的对象,因为它是一个算术类型,但是没有关于这种操作的结果的规范.我知道,大多数编译器定义time_tint一些大小,但单独的事实,它已经从改变int32int64在许多实现最近表明的变化的确是可能的.

所以我想出了这个解决方案,它应该与任何类型的工作std::time_t.它的工作原理我所看到的.但我想知道 - 我可能不知道有任何可能的陷阱吗?

template <>
inline System::DateTime marshal_as(const std::time_t &from_object)
{
    // Returns DateTime in Local time format from time_t (assumed to be UTC)
    const auto unix_epoch = makeUtcTime(1970, 1, 1, 0, 0, 0);
    const auto unix_epoch_dt = System::DateTime(1970, 1, 1, 0, 0, 0, System::DateTimeKind::Utc);
    const auto secondsSinceEpoch = std::difftime(from_object, unix_epoch);
    return const_cast<System::DateTime&>(unix_epoch_dt).AddSeconds(secondsSinceEpoch).ToLocalTime();
} // …
Run Code Online (Sandbox Code Playgroud)

.net datetime mixed-mode c++-cli time-t

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