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(我发现各种声明不这样做,但是项目是这样设置的,当我得到它并且它工作时(小心))。

至少这对我有帮助。