C# C+中的内部编译器错误+/CLI代码
我翻译了下面的C代码 转换为C++/CLI代码,如下所示:C# C+中的内部编译器错误+/CLI代码,c#,c++,.net,c++-cli,C#,C++,.net,C++ Cli,我翻译了下面的C代码 转换为C++/CLI代码,如下所示: try { a = gcnew A(args1...); b = gcnew A(args2...); dostuff(a, b); } finally { if (a != nullptr) delete a; if (b != nullptr) delete b; } 类型A、B、dostuff()是.NET库的一部分。我没有那个库的源代码 库收到了更新,构
try
{
a = gcnew A(args1...);
b = gcnew A(args2...);
dostuff(a, b);
}
finally
{
if (a != nullptr)
delete a;
if (b != nullptr)
delete b;
}
类型A、B、dostuff()是.NET库的一部分。我没有那个库的源代码
库收到了更新,构造函数得到了一个附加参数
现在它变得一团糟。我在两个调用(C++/CLI和C#)中都添加了附加参数(astring^
)
现在C#运行正常,C++/CLI会给出一个内部编译器错误
致命错误C1001:编译器中发生内部错误。
(编译器文件“f:\dd\vctools\compiler\cxxfe\sl\p1\c\cpimport.cpp”,
第16424行)
VS2017最新更新
@一些程序员都德:是的,但在实现方面,我不确定CLI是否也是如此。现在我知道了
@汉斯·帕桑:代码以前是有效的,所以我很确定这里不是这样。我可以进一步简化这个例子
事实上,A和B实际上不是不同的类型。
“A”的构造函数的形式为(c#):
现在,下面这一行导致了内部错误(c++):
代码很好,我不知道为什么会出现编译器错误,但是代码编写起来可能会容易得多 只需使用C++/CLI堆栈语义:
{
A a{args1...};
B b{args2...};
dostuff(%a, %b);
}
这意味着所有IDispose都在使用您需要的东西。代码接缝好的,我不知道为什么会出现编译器错误,但代码编写起来可能会简单得多 只需使用C++/CLI堆栈语义:
{
A a{args1...};
B b{args2...};
dostuff(%a, %b);
}
这意味着所有IDispose都在使用您需要的东西。与您的问题无关,但是
delete
接受空指针,它什么也不做。如果您在编译器中偶然发现了一个错误,最好的方法是将其提交给编译器供应商并尝试找到解决方法。这种情况会发生,当C++/CLI编译器的解析器被语法错误弄得太混乱时,它就不是那么防弹的了。代码片段不够好,无法指出问题所在,变量声明中缺少^hat是一个常见的问题。你必须向我们展示真实的代码。与你的问题无关,但是delete
接受空指针,它什么也不做。如果你在编译器中偶然发现一个bug,最好的方法是将它提交给编译器供应商,并试着找到解决方法。这种情况发生了,当C++/CLI编译器的解析器被语法错误弄得太混乱时,它就不是那么防弹的了。代码片段不够好,无法指出问题所在,变量声明中缺少^hat是一个常见的问题。你必须给我们看真正的代码。
A^ a = gcnew A( System::IO::File::Open(filename, System::IO::FileMode::Create), filename);
{
A a{args1...};
B b{args2...};
dostuff(%a, %b);
}