我在动态加载程序集时遇到 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 程序集作为单独的进程加载,但失败并生成异常。
这可能是由于使用混合模式造成的。
我想检查一下左侧按钮是否被按下。
我在Msdna上红了:
if(e->Button == MouseButtons.Left) {...}
//or
if(e->Button == ::MouseButtons.Left) {...}
Run Code Online (Sandbox Code Playgroud)
但它们都没有编译。
请使其尽可能简单。
我有本机(非托管)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# 应用程序不会加载它们?
我试着这样做:
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) 我使用以下代码禁用了表单的关闭按钮:
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++ 库、C++/CLI 包装器和 C# 程序集。在包装器中,我经常必须使用本机类型,因此我必须使用#pragma make_public. 然而,这些编译指示的问题是,您经常会遇到链接器错误 LNK2022,如此处和此处(以及许多其他地方)所讨论的。
通常的解决方案是将所有编译指示收集在一处,以避免重复类型错误。到目前为止,我发现的唯一可靠的地方是将列表放入我的stdafx.h头文件中。然而,这很烦人,因为一旦我必须在那里添加新的本机类型(这是我的预编译头),它就会导致我的整个项目重新编译。
我想将该列表提取到单独的标头中,或者更好的是 cpp 文件中。但到目前为止我的尝试还没有奏效。未公开的类型。看来我还必须将#pragma make_public调用放入头文件中。不过我更喜欢cpp。
那么,还存在哪些其他可能性呢?其他人在哪里拨打#pragma make_public电话?
我试图理解 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++ 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”
我在实现中缺少什么或者实现接口事件的正确方法是什么?
谢谢!
我目前正在尝试建立一个 .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) c++-cli ×10
c++ ×4
visual-c++ ×4
.net ×3
c# ×3
winforms ×2
assemblies ×1
clr ×1
interop ×1
managed-c++ ×1
mfc ×1
mixed-mode ×1
pragma ×1
stdstring ×1
string ×1
unmanaged ×1
winapi ×1