首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类库在使用时会丢失引用(Dll)。

类库在使用时会丢失引用(Dll)。
EN

Stack Overflow用户
提问于 2016-02-06 17:10:40
回答 1查看 1.6K关注 0票数 1

不好意思给了你这个头衔。我不知道怎么马上描述这个问题。我的问题是我有一个class-library,它有references to other (third party) DLLs。我需要在另一个项目中使用这个类库,所以我显然将类库的.dll添加到我的主项目中。

当我启动我的主项目时,总是会出现一个错误,即无法找到类库中的引用(dll)。

如果我将整个类库作为一个项目添加到visual studio中的项目图中,然后引用整个项目,则不会发生此错误。

我真的不想把整个类库作为一个项目添加到我创建的每个“主机”-project中。

有谁知道为什么在添加类库的.dll时会出现此错误,而不是当类库的整个项目被添加为引用时呢?

即使我没有添加整个库项目作为参考,也必须有一个解决方案来使其工作。否则,创建类库就没有任何意义了,对吗?

顺便提一下,:My类库包含第三方dll,第三方dll的本地复制属性设置为true。

提前感谢!

编辑:我的目标是使类库真正可移植,即使它包含第三方库。我只想把.dll给另一台pc,不用每次都添加整个类库项目。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-06 17:20:01

错误的原因是您没有在第二个项目中复制dll,而是向dll添加了一个引用,以便复制dll,而不是dll引用的dll,因此缺少库。

或者用dll重新分发依赖项,或者将dll作为资源嵌入dll中,然后拦截程序集加载并通过资源提供它:press/archive/2010/02/03/jeffrey-richter-excerpt-2-from-clr-via-c-third-edition.aspx

编辑:为了在dll中完成它,您需要在使用依赖于其他库的任何类之前使用静态类并调用静态初始化器。

下面是一个示例设置:

-A库名为LibraryB,它提供了这样一个简单的类:

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LibraryB
{
    public class ReferencedClass
    {
        public int GetIt()
        {

            return 5;

        }
    }
}

-A库名为LibraryA,它引用LibraryB并提供两个类,即初始化程序和真实类:

初始化器

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace LibraryA
{
    public static class Initializer
    {
        public static void Init()
        {
            AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
            {

                if (!args.Name.StartsWith("LibraryB"))
                    return null;

                return Assembly.Load(LibraryA.Properties.Resources.LibraryB);

            }; 
        }
    }
}

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LibraryA
{
    public class RealClass
    {
        public int DoIt()
        {

            LibraryB.ReferencedClass cl = new LibraryB.ReferencedClass();
            return cl.GetIt();

        }
    }
}

LibraryA还将LibraryB.dll编译库作为资源嵌入。

名为Test的-A项目,它只引用LibraryA:

代码语言:javascript
复制
using LibraryA;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Initializer.Init();
            RealClass c = new RealClass();
            Console.WriteLine("From LibraryA: " + c.DoIt());
            Console.ReadKey();
        }
    }
}

如果您正确设置并执行它,请记住,如果您是通过visual完成的,vs将复制dll以便在编译完所有复制exe和LibraryA并执行之后进行真正的测试,它将在没有LibraryB和LibraryB从LibraryA中使用的情况下工作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35243880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档