我用vs2008做了个CAB的工程,然后建了另外一个class lib的moudle,然后分别把这两个工程的build output路径设置到统一的文件夹下,然后build成功,点击那个.exe文件也可以运行。一切正常。但是当我用vs2008的run运行的时候,总是报错,说需要的那个dll找不到。就是那个主程序总是在它所在的文件夹下debug下寻找另外一个dll文件。是不是vs2008还需要设置什么属性才能运行这个工程啊?
不知道我说明白了没有。麻烦高手好心告诉一下,不胜感激。平时都是用vs2005的,刚用vs2008。很多地方不一样。找不到啊。
不知道我说明白了没有。麻烦高手好心告诉一下,不胜感激。平时都是用vs2005的,刚用vs2008。很多地方不一样。找不到啊。
解决方案 »
- C#Execl的数据导入ListView中显示
- 如何去掉websphere的ssl,不用https访问websphere??急!!急
- C# FTP上传 GetRequestStream()报错,求解.
- datagridview如何让其只能选中一行?
- c#实现web客户端异步上传文件时出现连接异常关闭的错误,望赶快解决(附带源码)
- 查询日期的比较问题
- 这么简单的程序都会出错?大家看一下.
- 关于c1flexgrid单元格付值的问题,请教!!!!!!!
- webBrowser里面怎么调用没有ID,Name的按钮点击事件
- 记录唯一性问题
- datagridview查找行的问题
- 自定义属性怎么获取(100分不够在给)
如果你非要把那些dll放到别的地方,那就不要用引用,用反射吧。
我首先建立一个main shell程序,用它来加载其他moudle,加载的maoudle都在xml里配置。main shell通过读xml,然后加载相应的moudle的dll文件。
我认为不用添加引用,因为我在output的文件夹下直接点击那个shell的.exe文件是能够直接运行起来的。只是用vs2008的start debug(就是run F5)的时候,那个main shell总是在自己所在目录下的bin文件夹下寻找需要加载的其他moudle的dll文件。所以我觉得是不是vs2008需要设置什么属性,或者设置什么的。是不是工作路径啊?如果是,怎么设置才对?我设置的工作路径和out path是一样的。但是设置完了后他还是去那个bin下找?不解。
不知道大家看明白我的描述了没有。希望能给个解答。谢谢!
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="IocInCSharp">
<section name="objects" type="IocInCSharp.ConfigHandler, MainApp" />
</sectionGroup>
</configSections>
<IocInCSharp>
<objects>
<object name="SayHello" assembly="SayHello.dll" typeName="IocInCSharp.SayHello">
<property name="HelloGenerator" assembly="HelloGenerator.dll"
typeName="IocInCSharp.CnHelloGenerator"></property>
</object>
</objects>
</IocInCSharp>
</configuration>配置文件解析
using System;
using System.Configuration;
using System.Xml;
namespace IocInCSharp
{
public class ConfigHandler:IConfigurationSectionHandler
{
public object Create(object parent, object configContext, System.Xml.XmlNode section)
{
ObjectInfo info;
PropertyInfo propInfo;
ConfigInfo cfgInfo = new ConfigInfo();
foreach(XmlNode node in section.ChildNodes)
{
info = new ObjectInfo();
info.name = node.Attributes["name"].Value;
info.assemblyName = node.Attributes["assembly"].Value;
info.typeName = node.Attributes["typeName"].Value;
foreach(XmlNode prop in node)
{
propInfo = new PropertyInfo();
propInfo.propertyName = prop.Attributes["name"].Value;
propInfo.assemblyName = prop.Attributes["assembly"].Value;
propInfo.typeName = prop.Attributes["typeName"].Value;
info.properties.Add(propInfo);
}
cfgInfo.Objects.Add(info);
}
return cfgInfo;
}
}
}
using System;
using System.IO;
using System.Configuration;
using System.Reflection;
namespace IocInCSharp
{
public class SayHelloFactory
{
public static object Create(string name)
{
Assembly assembly;
object o = null;
object p;
string rootPath = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) +
Path.DirectorySeparatorChar;
ConfigInfo cfgInfo = (ConfigInfo)ConfigurationSettings.GetConfig("IocInCSharp/objects");
ObjectInfo info = cfgInfo.FindByName(name);
if(info != null)
{
assembly = Assembly.LoadFile(rootPath + info.assemblyName);
o = assembly.CreateInstance(info.typeName);
Type t = o.GetType();
for(int i=0; i<info.properties.Count; i++)
{
PropertyInfo prop = (PropertyInfo)info.properties[i];
assembly = Assembly.LoadFile(rootPath + prop.assemblyName);
p = assembly.CreateInstance(prop.typeName);
t.InvokeMember(prop.propertyName,
BindingFlags.DeclaredOnly |
BindingFlags.Public | BindingFlags.NonPublic |
BindingFlags.Instance | BindingFlags.SetProperty, null, o, new Object[] {p});
}
}
return o;
}
}
}