1

我有 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;
    }
}

我可以使用 Visual Studio 创建 dll 并在 delphi 应用程序中使用它。当 delphi 应用程序调用该getDevices()函数时,我在 PortableDeviceCollection 类的实例化时遇到错误:

未找到文件或程序集“Interop.PortableDeviceApiLib,版本 = 1.0.0.0,文化 = 中性,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 应用程序。两人合作多年。现在我必须向 c# 库添加一个功能。我没有在项目中添加任何代码。我只是尝试再次编译它并使用 dll。我唯一做的就是通过 NuGet Packetmanager 更新 RGiesecke.DLLExport.Metadata。没有更新我得到一个错误

“Microsoft.Build.Utilities.ToolLocationHelper 找不到 ildasm.exe”

我知道这个在 C# 中枚举 Windows 便携式设备的问题。但是在达到问题所涉及的代码之前,我的错误就被抛出了。我仍然尝试了该问题的解决方案,但是答案中描述的操作(在 dll 中解组合、查找和替换)已经完成(否则我的代码将无法编译)。

错误消息对我来说没有意义。Interop.PortableDeviceApiLib是一个 COM-Lib,无法在不同的框架版本中下载。我想我在这里遗漏了一些东西。

谁能帮我?

4

1 回答 1

0

我终于能够解决这个问题。老实说,我不知道最终是什么解决了这个问题。对于每个偶然发现此问题的人,以下是我试图解决此问题的方法。它们没有特定的顺序(因为我多次尝试了所有内容):

  • 更新 RGiesecke.DLLExport 数据包
  • 将配置管理器中的平台更改为 x86
  • 在这个问题中取消、编辑和重新评估Interop.PortableDeviceApiLib类似内容(Christophe Geers 和 Bruno Klein 的回答)
  • 删除对Interop.PortableDeviceApiLib
  • 删除对Interop.PortableDeviceTypesLib
  • 阅读参考文献Interop.PortableDeviceApiLib
  • 阅读参考文献Interop.PortableDeviceTypesLib
  • 重建项目
  • 在两个 Interop-Libs 上将 Interoptyp embeddet 都设置为 false(我发现各种声明不这样做,但是当我得到它并且它工作(小心)时,项目是这样设置的)。

至少这对我有帮助。

于 2019-10-16T10:38:54.323 回答