aqu*_*nas 5 c# visual-studio-2010
这是我的示例场景.我有一个Console应用程序和一个类库dll(称之为libraryA).LibraryA dll引用了Oracle.DataAccess.dll版本4.112.2.0.Oracle DLL位于GAC中.LibraryA中对Oracle DLL的引用是"Copy Local = false".到现在为止还挺好.如果构建了LibraryA的DLL,然后Oracle.DataAccess.dll并没有在它的输出目录显示出来.好.现在我在我的控制台应用程序中引用libraryA dll.对libraryA dll的引用是"copy local = true".现在,当我构建控制台应用程序时,Oracle.DataAcess.dll 确实显示在控制台应用程序的输出目录中.但是,似乎这种方式的唯一DLL是Oracle dll.这是LibraryA的完整代码
public void Foo() {
Oracle.DataAccess.Client.OracleConnection c = new Oracle.DataAccess.Client.OracleConnection();
WebMatrix.WebData.OAuthAccountData x = new WebMatrix.WebData.OAuthAccountData("asd", "asd");
DevExpress.Web.ASPxCallback.ASPxCallback cvv = new DevExpress.Web.ASPxCallback.ASPxCallback();
}
Run Code Online (Sandbox Code Playgroud)
WebMatrix和DevExpress也像Oracle DLL一样在GAC中.但是,这些DLL都不会输出到输出目录,只输出Oracle dll.为什么?这里发生了什么事?
就此而言,您可以创建另一个类库,将其称为libraryB,不要将libraryB放在GAC中,从LibraryA引用LibraryB并设置copy local = false.即使这样做,libraryB也不会复制到控制台应用程序的输出目录中.当然,在这种情况下,程序会爆炸,因为它找不到库B,但至少Visual Studio尊重copy local flag = false.这个愚蠢的Oracle DLL有什么不同?
哦,还有一件事很有趣.如果在我的控制台应用程序中,我显式添加了对Oracle.DataAccess.dll的引用,并说copy local = false,那么它不会显示在输出目录中.没有一个DLL出现在输出目录中似乎有点搞笑,我必须实际引用它:)
编辑:
另一个线索.为了折磨开发人员,Oracle没有为AnyCPU构建一个DLL.它们有x86和x64版本.就我而言,我正在引用x86版本并为AnyCPU构建.但是,如果我为x86构建(以匹配oracle dll),则Oracle DLL 不会复制到输出目录.在AnyCPU中构建时,MSBUILD说:"警告MSB3270:正在构建的项目的处理器体系结构"MSIL"与参考"Oracle.DataAccess,Version = 4.112.2.0,Culture = neutral,"的处理器体系结构不匹配. PublicKeyToken = 89b483f429c47342,processorArchitecture = x86","x86".这种不匹配可能会导致运行时故障.请考虑通过Configuration Manager更改项目的目标处理器体系结构,以便在项目和引用之间调整处理器体系结构,或者采用依赖于具有与项目的目标处理器体系结构相匹配的处理器体系结构的引用." 所以,几乎看起来Msbuild最终决定,好吧,你有一个不匹配,所以让我继续把这个dll复制到你的输出目录,从而保证你的应用程序会爆炸.:)
不引用它,就是让它使用隐式规则。好吧,这里的隐含默认值是“将其复制到本地”,因为大多数dll 不在 GAC 中。IDE 有一个疯狂的想法,即默认“让它工作”,这意味着“假设它不会出现在 GAC 中”。
如果你想使用明确的规则,那么是的:你需要告诉它你想要什么。你这样做的方法是添加一个引用,然后设置你想要的选项。
| 归档时间: |
|
| 查看次数: |
1860 次 |
| 最近记录: |