如何在自定义控件中正确处理引用

8
我使用C#创建了一个类库来导出两个自定义控件。这个类库需要一些引用,当我只添加控件DLL作为引用时,这些引用会被复制到bin\Debug目录下(使用自定义控件的解决方案构建)。到目前为止,一切都很好。
现在,如果我将控件从该输出目录添加到工具箱中并将其放置在设计器中的空表单上,则Visual Studio会崩溃。如果像http://msdn.microsoft.com/en-us/library/5ytx0z24(VS.80).aspx所示从自定义控件解决方案开始进行调试,我会看到IO异常,即找不到其中一个引用的DLL。
所以,有没有一种相当优雅的方法可以让设计器找到依赖项?我尝试在项目设置中调整引用路径,但无济于事。我更喜欢避免设置系统范围的路径并在每次更改代码时安装/注册控件。

请问你能告诉我是哪个 DLL 找不到吗?是你明确添加的那个 DLL 吗? - sihirbazzz
你是什么意思?哪一页?顺便说一句,如果我在程序中添加控件,当运行我的应用程序时它可以正常工作。 - Keiichi
如果我没有误解,当您在另一个命名空间中添加自定义控件/引用时,它不起作用,对吗?这有几个原因...1-) 您同时使用了调试混淆和代码优化选项 2-) 您没有将dll引用设置为copyLocale选项 3-) 您没有在引用列表和/或要使用控件的窗体中显式调用您的dll 4-) 您的dll或主项目的一个或多个部分未签名,而其他部分已签名...请检查这些并让我知道。顺便说一下,如果您不写出错误或错误代码,没有人可以作为参考帮助您。 - sihirbazzz
很多第三方开发者都会签署或延迟签署他们的代码。如果你没有签署你的代码,而你尝试使用的dll已经被签署了,你就会遇到这个错误。即使是延迟签署也不能调试程序集/ dll。你有告诉这个dll的开发者吗?而且只有很少一部分人会把引用复制到app.path中调用,还是复制并调用另一个副本?(例如,你首先下载的dll文件在哪里)如果可以通过编程方式添加,那么为什么要等待添加引用呢? - sihirbazzz
如果“引用路径”不像你说的那样工作,那么你可以尝试在自定义控件的构造函数中手动加载dlls(System.Reflection.Assembly.LoadFile)(仅在设置了this.DesignMode时才进行手动加载)。出于类似于此类原因,我倾向于避免使用设计器,所以我不确定它是否有效,但值得一试! - Thracx
显示剩余3条评论
1个回答

0
为什么不直接引用整个项目,而是手动复制dll文件呢?如果你有充分的理由这样做,那就没问题了,但看起来你在问一个根本不需要问的问题!:P

很不错的尝试,但这个问题确实需要问一下,因为将项目包含在解决方案中,然后引用它并没有帮助。如上所述,未找到的dll是被引用项目的引用。而且,使用自定义组件将缺失的引用显式添加到项目中也没有帮助。dll仍然无法找到,并抛出IO异常。 - Keiichi
好的,你是说添加项目输出的引用而不是DLL不起作用?这非常奇怪...甚至比找不到DLL更奇怪!有没有可能你能够在线上放一个出现同样问题的项目?如果你提供一个(不)工作的示例,我们可能会提供更多帮助! - Faraday
我再说一遍,我们正在谈论嵌套引用。引用项目或dll可以正常工作,但是被引用项目所引用的内容无法找到。 - Keiichi
@Keiichi - 那让我确认一下。ProjectA引用了ProjectB,ProjectB引用了一个DLL,但是当你从ProjectA调用ProjectB中需要该DLL的方法(或类似的操作)时失败了?如果是这种情况(你已经说过你已经正确设置了CopyLocal),那么为什么你不能创建一个设置相同的示例项目(project A -> Project B -> DLL),让我们看看并帮助你呢?如果有东西可以使用,这只需要两分钟!此外,没有必要因为你不得不重新表达某些内容而变得粗鲁,我只是想帮忙! - Faraday

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接