C# 中的 PortableDeviceManagerClass 无法初始化
PortableDeviceManagerClass in C# not able to initialize
我有一个 c# 库,它提供了一些将数据上传到连接的 (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";
}
}
这是 class 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;
}
}
我可以用 visual studio 创建 dll 并在 delphi 应用程序中使用它。当 delphi 应用程序调用 getDevices()
函数时,我在 PortableDeviceCollection class:
实例化时遇到错误
The file or assembly "Interop.PortableDeviceApiLib, Version = 1.0.0.0,
Culture = neutral, PublicKeyToken = null" or a dependency of it was
not found. The assembly is created by a runtime that is more recent
than the currently loaded runtime and can not be loaded.
ProductXY.PortableDeviceCollection..ctor()
ProductXY.ProductXYMain.getDevices()
c# 项目的目标框架设置为 .Net Framework 4
。使用任何较低版本时,我在尝试编译项目时遇到错误:
The primary reference "Interop.PortableDeviceApiLib" could not be
resolved because it has an indirect dependency on the .NET Framework
assembly "mscorlib, version = 4.0.0.0, Culture = neutral,
PublicKeyToken = b77a5c561934e089", which is a higher version 4.0.0.0
than version 2.0.0.0 in the current target framework.
请注意。我既没有编写 c# 库,也没有编写 delphi 应用程序。两人一起工作多年。现在我必须向 c# 库添加一个功能。我没有向项目添加任何代码。我只是试着再次编译它并使用 dll。我唯一做的就是通过 NuGet Packetmanager 更新 RGiesecke.DLLExport.Metadata。没有更新我得到一个错误
"Microsoft.Build.Utilities.ToolLocationHelper could not find
ildasm.exe"
我知道这个 Enumerating Windows Portable Devices in C# 问题。但是我的错误是在到达问题所涉及的代码之前抛出的。我仍然尝试了问题的解决方案,但是answere中描述的操作(在dll中进行反汇编,查找和替换)已经完成了(否则我的代码将无法编译)。
错误消息对我来说没有意义。 Interop.PortableDeviceApiLib
是一个 COM-Lib,无法在不同的框架版本中下载。我想我在这里遗漏了一些东西。
谁能帮帮我?
我终于解决了这个问题。老实说,我不知道最终是什么解决了这个问题。对于每一个偶然发现这个问题的人,这里是我试图解决这个问题的东西。它们没有特定的顺序(因为我多次尝试了一切):
- 正在更新 RGiesecke.DLLExport 数据包
- 将配置管理器中的平台更改为 x86
- 像 this 问题(Christophe Geers 和 Bruno Klein 的回答)
- 删除对
Interop.PortableDeviceApiLib
的引用
- 删除对
Interop.PortableDeviceTypesLib
的引用
- 正在阅读对
Interop.PortableDeviceApiLib
的引用
- 正在阅读对
Interop.PortableDeviceTypesLib
的引用
- 重建项目
- 在两个 Interop-Lib 上都将 Interoptyp embeddet 设置为 false(我发现各种声明不这样做,但是项目是这样设置的,当我得到它并且它工作时(小心))。
至少这对我有帮助。
我有一个 c# 库,它提供了一些将数据上传到连接的 (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";
}
}
这是 class 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;
}
}
我可以用 visual studio 创建 dll 并在 delphi 应用程序中使用它。当 delphi 应用程序调用 getDevices()
函数时,我在 PortableDeviceCollection class:
The file or assembly "Interop.PortableDeviceApiLib, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null" or a dependency of it was not found. The assembly is created by a runtime that is more recent than the currently loaded runtime and can not be loaded.
ProductXY.PortableDeviceCollection..ctor()
ProductXY.ProductXYMain.getDevices()
c# 项目的目标框架设置为 .Net Framework 4
。使用任何较低版本时,我在尝试编译项目时遇到错误:
The primary reference "Interop.PortableDeviceApiLib" could not be resolved because it has an indirect dependency on the .NET Framework assembly "mscorlib, version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089", which is a higher version 4.0.0.0 than version 2.0.0.0 in the current target framework.
请注意。我既没有编写 c# 库,也没有编写 delphi 应用程序。两人一起工作多年。现在我必须向 c# 库添加一个功能。我没有向项目添加任何代码。我只是试着再次编译它并使用 dll。我唯一做的就是通过 NuGet Packetmanager 更新 RGiesecke.DLLExport.Metadata。没有更新我得到一个错误
"Microsoft.Build.Utilities.ToolLocationHelper could not find ildasm.exe"
我知道这个 Enumerating Windows Portable Devices in C# 问题。但是我的错误是在到达问题所涉及的代码之前抛出的。我仍然尝试了问题的解决方案,但是answere中描述的操作(在dll中进行反汇编,查找和替换)已经完成了(否则我的代码将无法编译)。
错误消息对我来说没有意义。 Interop.PortableDeviceApiLib
是一个 COM-Lib,无法在不同的框架版本中下载。我想我在这里遗漏了一些东西。
谁能帮帮我?
我终于解决了这个问题。老实说,我不知道最终是什么解决了这个问题。对于每一个偶然发现这个问题的人,这里是我试图解决这个问题的东西。它们没有特定的顺序(因为我多次尝试了一切):
- 正在更新 RGiesecke.DLLExport 数据包
- 将配置管理器中的平台更改为 x86
- 像 this 问题(Christophe Geers 和 Bruno Klein 的回答)
- 删除对
Interop.PortableDeviceApiLib
的引用
- 删除对
Interop.PortableDeviceTypesLib
的引用
- 正在阅读对
Interop.PortableDeviceApiLib
的引用
- 正在阅读对
Interop.PortableDeviceTypesLib
的引用
- 重建项目
- 在两个 Interop-Lib 上都将 Interoptyp embeddet 设置为 false(我发现各种声明不这样做,但是项目是这样设置的,当我得到它并且它工作时(小心))。
至少这对我有帮助。