标签: c++-cli

在 C++/CLI 中动态加载 EXE 程序集时发生异常(无法加载文件或程序集',版本 = 1.0.3836.39802 ...)

我在动态加载程序集时遇到 C++/CLI 异常,该程序集本身使用Assembly.Load. 它成功加载 DLL 程序集,但无法加载 EXE 程序集并生成以下异常:

TestManager.dll 中发生“System.IO.FileLoadException”类型的未处理异常

无法加载文件或程序集“testAssembly,Version=1.0.3836.39802,Culture=neutral,PublicKeyToken=null”或其依赖项之一。尝试使用修复程序加载无法验证的可执行文件(具有超过 2 个部分或 TLS 部分的 IAT。)

HRESULT 异常:0x80131019

TestManager.dll 本身是一个托管 dll,并在 CLI 中加载到另一个 CLR 进程中,并尝试将 EXE 程序集作为单独的进程加载,但失败并生成异常。

这可能是由于使用混合模式造成的。

.net mixed-mode assemblies c++-cli visual-c++

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

C++/cli 中的 MouseButtons::Left

我想检查一下左侧按钮是否被按下。

我在Msdna上红了:

if(e->Button == MouseButtons.Left) {...}
//or
if(e->Button == ::MouseButtons.Left) {...}
Run Code Online (Sandbox Code Playgroud)

但它们都没有编译。

c++-cli

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

无法理解普通c++与vc++、win32编程、mfc、win32 api、CLI之间的关系

  1. 什么是mfc、cli、win32?您能帮我了解 Visual Studio 与这两者的关系如何工作吗?
  2. c++和vc++有什么区别?当我们说“vc++”时,它是否意味着默认的对话框、窗体、窗口和其他 gui 元素?
  3. 如果我在 Visual C++ 中创建基于控制台的应用程序,而不使用任何 win32 编程,它是否符合可视化应用程序的资格?
  4. 框、对话框、表单和其他 gui 是否属于 win32 编程,或者它们有什么不同?
  5. 除了基于控制台和 win32 编程之外,C++ 中还有哪些其他类型的编程?

请使其尽可能简单。

c++ winapi mfc c++-cli visual-c++

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

C++/CLI 包装器 DLL TypeLoadException 字段过多

我有本机(非托管)C++ DLL,它们由单个 C++/CLI dll 包装(通过 .lib 文件链接)。这些非托管 C++ DLL 有相当多的类,其中包含大量方法和大量常量数据(例如字符串、十六进制值等),这些数据在包含的标头中定义。

但对于 C++/CLI 包装器 DLL,它只是本机 dll 的包装和编组层。然而,它的二进制大小与本机 dll 一样大。我相信这导致我达到了硬编码限制,当 C# 应用程序加载它时会引发异常: System.TypeLoadException: Internal limit: Too much fields

C# 应用程序永远不会使用本机 DLL 标头中定义的字段。

它能够通过启用字符串池(减少几MB)来缓解这个问题,但这看起来像是一种黑客行为。

为什么 DLL 的简单包装器与该 DLL 的大小相同?有没有办法可以标记 const 数据,以便 C# 应用程序不会加载它们?

c++-cli visual-c++

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

如何将字符串添加到 Windows 窗体标签?

我试着这样做:

this->Label1->Text = "blah blah: " + GetSomething();
Run Code Online (Sandbox Code Playgroud)

哪里GetSomething()是返回字符串的函数。

编译器给了我一个错误:

“错误 C2679:二进制 '+':未找到采用 'std::string' 类型的右侧操作数的运算符(或没有可接受的转换)”

string GetSomething()
{
    int id = 0;
    string Blah[] = {"test", "fasf", "hhcb"};

    return Blah[id];
}
Run Code Online (Sandbox Code Playgroud)

.net string c++-cli stdstring winforms

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

如何重新启用Windows窗体中的关闭按钮?

我使用以下代码禁用了表单的关闭按钮:

virtual property System::Windows::Forms::CreateParams^ CreateParams
{
    System::Windows::Forms::CreateParams^ get() override
    {
        System::Windows::Forms::CreateParams^ cp = Form::CreateParams;
        cp->ClassStyle |= 0x200; //CP_NOCLOSE_BUTTON
        return cp;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我想在例如 foo() 函数中重新启用此关闭按钮。我能怎么做?

c++-cli winforms

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

建议放置 make_public pragmas 的位置

在一个复杂的解决方案中,我混合了本机 C++ 库、C++/CLI 包装器和 C# 程序集。在包装器中,我经常必须使用本机类型,因此我必须使用#pragma make_public. 然而,这些编译指示的问题是,您经常会遇到链接器错误 LNK2022,如此此处(以及许多其他地方)所讨论的。

通常的解决方案是将所有编译指示收集在一处,以避免重复类型错误。到目前为止,我发现的唯一可靠的地方是将列表放入我的stdafx.h头文件中。然而,这很烦人,因为一旦我必须在那里添加新的本机类型(这是我的预编译头),它就会导致我的整个项目重新编译。

我想将该列表提取到单独的标头中,或者更好的是 cpp 文件中。但到目前为止我的尝试还没有奏效。未公开的类型。看来我还必须将#pragma make_public调用放入头文件中。不过我更喜欢cpp。

那么,还存在哪些其他可能性呢?其他人在哪里拨打#pragma make_public电话?

c# c++ c++-cli pragma visual-studio

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

如何将托管结构转换为 C++/native

我试图理解 C#/C++ 互操作的这种“它只是工作”的魔力,但目前它只是一个噩梦。

我正在玩 Mandelbrot 计算,并希望将计算核心卸载到本机 C++ 和 SSE2。这是工作,与 P/Invoke。现在我想更改为 IJW,以便更安全,因为我想了解它。但我接触 C++ 的表面已经是几十年前的事了。

我有一个struct Complex { double real; double imag; }保存 Mandelbrot 循环的起始值,我想调用这样的函数:

Compute(int vectorSize, Complex[] points, double maxValue, int maxLoops, int[] result)

现在我使用 VS Express 2013 创建了一个 CLR 类库并将其放入头文件中:

public value struct Complex
{
    double real;
    double imag;
};

public ref class Computations
{
public:
    static void Basic(int vectorSize, array<Complex,1>^ points, double maxRadius, int maxLoops, array<int,1>^ result);
};

class NativeComputations
{
public:
    static void Basic(int vectorSize, Complex* …
Run Code Online (Sandbox Code Playgroud)

c# interop unmanaged c++-cli

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

如何在托管 C++ 中正确实现带有事件的 C# 接口

您好,我正在尝试在我的托管 C++ dll 中实现 C# 接口,如下所示:

public ref class MyClass : public IMyInterface 
{
 // Inherited via IMyInterface
 virtual event EventHandler<MyEventArgs ^> ^ MyLoadedEvent;

 public:
     virtual event EventHandler<MyEventArgs ^> MyLoadedEvent 
                {
                    void add(MyEventArgs ^ f)
                    {
                      // some magic
                    }
                    void remove(MyEventArgs ^ f)
                    {
                      // some magic
                    }
                }
}
Run Code Online (Sandbox Code Playgroud)

但我不断收到两个错误:

1) 事件类型必须是句柄到委托类型

2) 类未能实现在...dll 中声明的接口成员函数“MyLoadedEvent::add”

我在实现中缺少什么或者实现接口事件的正确方法是什么?

谢谢!

c# c++ managed-c++ c++-cli visual-c++

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

链接 C++ 和 C++/CLI 项目 (.NET Core) 时导入错误 (E0337)

我目前正在尝试建立一个 .NET 项目。我有一个现有的 C++ 后台项目,我想在 Web 界面上显示它。为此,我试图通过CLR 类库 .NET Core将我的 C++ 链接到 .NET 平台(并最终将其链接到ASP.NET Web 界面,但这是下一步)。

当我尝试将原始文件导入 C++/CLI 项目时,我的问题就出现了。当我尝试导入的文件使用 C++ 向量 ( #include <vector>) 时,我收到 8 个错误,所有错误都包含E0337 linkage specification is incompatible with previous "bsearch_s" (decalred at line 26)在文件corecrt_search.h(作为 Windows 10 工具包文件)中。您可以在此屏幕截图上看到错误的完整内容。

其他错误分别针对函数 qsort_s、bsearch、_lfind_s、_lfind、_lsearch_s、_lsearch 和 qsort 在第 35、48、64、74、83、93 和 56 行。

当我导入的文件不使用向量时不会出现错误。

文件corecrt_search.h确实包含这些函数的两个声明,每个声明都应该在不同的上下文中编译。这是这个文件的一小部分摘录(希望这已经足够了)。

_CRT_BEGIN_C_HEADER

_Check_return_
_ACRTIMP void* __cdecl bsearch(...);


// Managed search routines
#if defined __cplusplus && defined …
Run Code Online (Sandbox Code Playgroud)

.net c++ clr c++-cli

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