Man*_*ert 16 c# c++ interop ref roslyn
我用我现有的解决方案尝试了VS2015,我得到了一些有效的新错误(比如编译器之前没有捕获到的无法访问的代码),但是我在这一行上也遇到了错误:
bool bWasAlreadyLocked = false;
oEnv.LockDoc(oWarnings, oEventDoc, ref bWasAlreadyLocked);
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
错误CS1503参数3:无法从'ref bool [mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]'转换为'ref bool [mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089] "
我不明白为什么它会抛出那个错误,显然类型确实匹配.这是新编译器中的错误还是ref关键字的行为发生了变化?
这种情况下的函数是一个C++函数,它使用从c ++类派生的ac#类导入到C#.它的签名是这样的:
void CBkgDocEnvX::LockDoc(
CFIWarningList ^oWarnings,
CBaseDoc ^oBaseDoc,
// Output
bool %rbWasAlreadyLocked)
Run Code Online (Sandbox Code Playgroud)
值得一提的是,我现在选择在解决方案中使用VS2013 c ++编译器作为c ++源代码,因此c ++方面应该与以前一样.我的猜测是c#和c ++之间的互操作发生了变化.
事实证明,可以通过向参数显式添加 out 属性来修复此错误。
添加[Out]到ref参数显然有助于新的 C# 编译器识别这些是相同的类型并接受它们。我们的互操作解决方案中的方法现在如下所示:
using namespace System::Runtime::InteropServices;
...
virtual void LockDoc(
CFIWarningList ^oWarnings,
CBaseDoc ^oBaseDoc,
// Output
[Out] bool %rbWasAlreadyLocked
) override;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1000 次 |
| 最近记录: |