Я пробовал VS2015 с помощью своего существующего решения, и я получаю несколько новых допустимых ошибок (например, недоступный код, который компилятор не перехватывал раньше), но я также получаю ошибку, например, в этой строке:
bool bWasAlreadyLocked = false;
oEnv.LockDoc(oWarnings, oEventDoc, ref bWasAlreadyLocked);
Я получаю следующую ошибку:
Ошибка CS1503 Аргумент 3: невозможно преобразовать из ‘ref bool [mscorlib,
Версия = 4.0.0.0, Культура = нейтральная, PublicKeyToken = b77a5c561934e089] ‘до
‘ref bool [mscorlib, версия = 4.0.0.0, культура = нейтральная,
PublicKeyToken = b77a5c561934e089]
Я не могу понять, почему это вызвало бы такую ошибку, очевидно, типы совпадают. Это ошибка в новом компиляторе или имеет поведение ref
ключевое слово изменилось?
Функция в этом случае является функцией C ++, которая импортируется в C # с использованием класса c #, производного от класса c ++. Это подпись такова:
void CBkgDocEnvX::LockDoc(
CFIWarningList ^oWarnings,
CBaseDoc ^oBaseDoc,
// Output
bool %rbWasAlreadyLocked)
Возможно, стоит упомянуть, что я решил использовать компилятор VS2013 c ++ для исходных текстов c ++ в решении, поэтому сторона c ++ должен быть таким же, как и раньше. Я предполагаю, что что-то во взаимодействии между c # и c ++ изменилось.
Вы должны проверить этот пункт просто чтобы быть уверенным.
Вы можете найти больше информации Вот.
Я получаю такие ошибки компилятора, когда два проекта имеют несовместимые типы. Часто Visual Studio позволяет мне добавлять ссылку на проект Portable Class Library (или проект .NET 4.0), даже если ссылка на сборку не поддерживается типом профиля .NET ссылочного проекта.
Самым распространенным явлением для меня является использование проекта .NET 4.0 и попытка сослаться на проект библиотеки вероятных классов, в котором в настройках профиля указан .NET 4.5, а не более старая версия .NET 4. Когда я ссылаюсь на сборку PCL из моего проекта .NET 4.0, я продолжаю получать полную поддержку intellisense (например, при редактировании исходного кода intellisense отображает все пространства имен, классы и свойства, содержащиеся в ссылочной сборке), но во время компиляции я получаю та же самая ошибка, которую вы получаете; более конкретно, когда я компилирую решение, компиляция указывает на несоответствие библиотеки, но перечисляет точно такую же библиотеку, версию и открытый ключ, которые, по ее словам, она ищет.
Проверьте свойства проекта, убедитесь, что они совместимы.
Оказывается, эту ошибку можно исправить, явно добавив в параметр атрибут out.
Добавление [Out]
к ref
Параметр, очевидно, помогает новому компилятору C # распознать, что это одни и те же типы, и принять их. Методы в нашем решении взаимодействия теперь выглядят так:
using namespace System::Runtime::InteropServices;
...
virtual void LockDoc(
CFIWarningList ^oWarnings,
CBaseDoc ^oBaseDoc,
// Output
[Out] bool %rbWasAlreadyLocked
) override;
Вы можете попробовать использовать тип данных Object вместо Boolean. После этого вы можете разобрать его в Boolean.