У меня есть библиотека ac #, которая предоставляет некоторые функциональные возможности для загрузки данных на подключенные (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 с Visual Studioи использовать это внутри приложения Delphi. Когда приложение Delphi вызывает функцию getDevices()
, я получаю сообщение об ошибке при создании класса PortableDeviceCollection:
Файл или сборка "Interop.PortableDeviceApiLib, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null "или его зависимость не найдена. Сборка создается средой выполнения, более поздней, чем текущая загруженная среда, и не может быть загружена.
ProductXY.PortableDeviceCollection..ctor ()
ProductXY.ProductXYMain.getDevices ()
Целевой фреймворк для проекта c # установлен на .Net Framework 4
. Используя любую более низкую версию, я получаю сообщение об ошибке при попытке скомпилировать проект:
Первичная ссылка «Interop.PortableDeviceApiLib» не может быть разрешена, поскольку она имеет косвенную зависимость от сборки .NET Framework ». mscorlib, версия = 4.0.0.0, культура = нейтральная, PublicKeyToken = b77a5c561934e089 ", которая является более поздней версией 4.0.0.0, чем версия 2.0.0.0 в текущей целевой структуре.
Обратите внимание. Я не написал ни библиотеку c #, ни приложение delphi. Оба работали вместе годами. Теперь я должен добавить functionallity в библиотеку c #. Я не добавил ни одного кода в проект. Я просто попытался скомпилировать его снова и использовать DLL. Единственное, что я сделал, это обновил RGiesecke.DLLExport.Metadata через NuGet Packetmanager. Без обновления я получил ошибку
"Microsoft.Build.Utilities.ToolLocationHelper не смог найти ildasm.exe"
Мне известно об этом Перечисление Windows PortableУстройства в C # вопрос. Но моя ошибка возникает до того, как код, который обрабатывается вопросом, будет достигнут. Я все еще пытался решить вопрос, но действие (deassamble, find и replace в dll), которое описано в ответе, уже выполнено (иначе мой код не скомпилировался бы).
Ошибкасообщение не имеет смысла для меня. Interop.PortableDeviceApiLib
- это COM-Lib, который недоступен для загрузки в разных framework-версиях. Я думаю, что я что-то здесь упускаю.
Кто-нибудь может мне помочь?