【问题标题】:How to call a C# DLL from console project?如何从控制台项目调用 C# DLL?
【发布时间】:2015-03-04 18:37:10
【问题描述】:

我的 C# 项目有问题。这是我的场景。

我有一个外部 dll,比如说 original.dll,我需要将它包装起来,以便它可以在多个 vb.net 应用程序中使用,所以我正在制作另一个 dll 来包装这个名为 external.dll 的原始 dll。所以当我开发这个类库 dll 时,我使用一个简单的控制台项目来测试它,我包含了引用,构建和测试它没有问题......至少是第一次,因为当我尝试重建时我的库并再次运行它会引发异常

FileNotFoundException

无法加载文件或程序集 'LynkLib, Version=1.0.5533.27875, Culture=neutral, PublicKeyToken=null' 或其任何依赖项。

我已经仔细检查了 VS 中的引用以及我文件夹中的文件。我尝试重新启动 VS,但什么也没有。

这是我的代码,但我不知道它是否有帮助,因为我认为这是某种配置问题。

外部库

using System.IO;
using System.Net;
...

[assembly: CLSCompliant(true)] //to use also in vb.net 

namespace externalDLL{

    [ComVisible(true)]
    public class Lynk
    {
        //...my code
    }
}

要测试的控制台项目

...
using externalDLL;

namespace TestLynk
{
    class Program
    {
        static void Main(string[] args)
        {
            externalDLL.Lynk l = new Lynk(); //Here the exception is triggered
            ...
        }
    }
}

更新

我发现问题出在original.dll。我不能修改那个dll的代码,我只能编辑external.dll。我反编译了原来的dll,可以看到如下汇编信息

using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;

// Assembly LynkLib, Version=1.0.5533.27875, Culture=neutral,      PublicKeyToken=null
// MVID: E24FF563-B283-431E-9D53-71A59E4750E1
// References: System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
// References: mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
// References: System.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// References: System.Xml, Version=4.0.0.0, Culture=neutral,  PublicKeyToken=b77a5c561934e089

[assembly: AssemblyTitle("LynkLib")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("###")]
[assembly: AssemblyProduct("###")]
[assembly: AssemblyCopyright("###")]
[assembly: AssemblyTrademark("")]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: AssemblyVersion("1.0.5533.27875")]

在其余的代码上,我可以看到很多问题,有很多,但他们基本上说两件事// ISSUE: explicit constructor call// ISSUE: variable of a boxed type

我也将我的 .NET 版本降级到 4.0,但仍然有问题。有什么想法吗?

【问题讨论】:

  • DLL 的目标是 .NET 框架的更高版本,而不是引用它的控制台应用程序吗?
  • 控制台应用程序和类库dll在同一个.NET版本,即4.5版
  • “Original.dll”和“external.dll”当错误是关于“LynkLib”时是无用的名称。使用 Fuslogvw.exe 解决程序集解析问题。注意自动生成的版本号,例如 1.0.5533.27875
  • @HansPassant 我不知道我是否正确,但 LynkLib 名称是对 Lynk 类的引用,因为我没有任何类、对象或名为 LynkLib 的文件。 .cs 文件称为 Lynk.cs,引发异常的对象的类是 Lynk。还有两件事,我不知道如何使用Fuslogvw.exe,而且我还注意到了自动生成的版本号,因为我检查了我的 assemblyInfo.cs 文件,我有版本 1.0.0.0 的 AssemblyVersionAssemblyFileVersion

标签: c# exception dll


【解决方案1】:

通常是当您引用构建到不同 .net 目标或平台(x86 或 64 位)的 dll 作为当前项目的设置时。否则,其中一个 dll 引用了另一个找不到的 dll。您可以从 JetBrains 免费下载 DotPeek 并进行安装。使用 DotPeek 打开 dll 并查看它们引用了哪些其他 dll。

【讨论】:

  • 我按照您的建议使用了DotPeek,并找到了一些可能有帮助的信息,请查看我对问题的更新。
  • 再次检查您的项目和内部 dll 目标是否针对与 external.dll 相同的 .NET 框架。此外,您可能有重复的 LinkLib dll,并且选择了错误的而不是您引用的那个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多