У меня есть библиотека С#, которая предоставляет некоторые функциональные возможности для загрузки данных на подключенные устройства (Android). Сама dll экспортируется через UnmangedExports для использования приложением Delphi.
Вот функция, которая вызывается приложением delphi:
[DllExport]
[return: MarshalAs(UnmanagedType.LPStr)]
public static string getDevices()
{
try
{
var devices = string.Empty;
var collection = new PortableDeviceCollection();
collection.Refresh();
foreach (var device in collection)
{
device.Connect();
if (devices != string.Empty)
{
devices += ";";
}
devices += device.FriendlyName;
device.Disconnect();
}
return devices;
}
catch (Exception e)
{
SomeClass.WriteErrorToLogFile(e);
return "ERROR";
}
}
Вот класс PortableDeviceCollection:
public class PortableDeviceCollection : Collection<PortableDevice>
{
private readonly PortableDeviceApiLib.PortableDeviceManagerClass _deviceManager;
public PortableDeviceCollection()
{
this._deviceManager = new PortableDeviceApiLib.PortableDeviceManagerClass();
}
public bool Refresh()
{
this._deviceManager.RefreshDeviceList();
// Determine how many WPD devices are connected
var deviceIds = new string[1];
uint count = 1;
this._deviceManager.GetDevices(null, ref count);
if (count > 0)
{
// Retrieve the device id for each connected device
deviceIds = new string[count];
this._deviceManager.GetDevices(deviceIds, ref count);
foreach (var deviceId in deviceIds)
{
Add(new PortableDevice(deviceId));
}
return true;
}
else
return false;
}
}
Я могу создать dll с визуальной студией и использовать ее внутри приложения Delphi. Когда приложение delphi вызывает функцию getDevices()
, я получаю сообщение об ошибке при создании экземпляра класса PortableDeviceCollection:
Файл или сборка «Interop.PortableDeviceApiLib, версия = 1.0.0.0, культура = нейтральная, PublicKeyToken = null» или зависимость от нее не найдены. Сборка создается средой выполнения, которая является более поздней, чем загруженная в данный момент среда выполнения, и не может быть загружена.
ProductXY.PortableDeviceCollection..ctor()
ProductXY.ProductXYMain.getDevices()
В качестве целевой платформы для проекта С# установлено значение .Net Framework 4
. Используя любую более низкую версию, я получаю сообщение об ошибке при попытке скомпилировать проект:
Первичная ссылка «Interop.PortableDeviceApiLib» не может быть разрешена, поскольку она косвенно зависит от сборки .NET Framework «mscorlib, версия = 4.0.0.0, культура = нейтральная, PublicKeyToken = b77a5c561934e089», которая является более высокой версией 4.0.0.0. чем версия 2.0.0.0 в текущей целевой структуре.
Пожалуйста, обрати внимание. Я не писал ни библиотеку С#, ни приложение Delphi. Оба работали вместе в течение многих лет. Теперь мне нужно добавить функциональность в библиотеку С#. Я не добавлял код в проект. Я просто попытался скомпилировать его снова и использовать dll. Единственное, что я сделал, это обновил RGiesecke.DLLExport.Metadata через NuGet Packetmanager. Без обновления я получил ошибку
«Microsoft.Build.Utilities.ToolLocationHelper не удалось найти ildasm.exe»
Мне известно об этом перечислении портативных устройств Windows в C#. Но моя ошибка возникает до того, как будет достигнут код, на который распространяется вопрос. Я еще попробовал решение вопроса, но действие (разобрать, найти и заменить в dll), которое описано в ответе, уже сделано (иначе мой код не скомпилировался бы).
Сообщение об ошибке не имеет для меня смысла. Interop.PortableDeviceApiLib
— это COM-Lib, которая недоступна для загрузки в различных версиях фреймворка. Я думаю, что я что-то упускаю здесь.
Может кто-нибудь помочь мне?