不久前,我在Stack Overflow,程序集名称和版本上询问了以下问题.
现在我已经意识到我无法使用强名称签署我的程序集,因为第三方依赖项之一不是强名称程序集,因此我的签名不可信.
我试图简单地将程序集文件名MyAssembly.dll更改为MyAssembly.v.1.1.dll,但是当我这样做并引用重命名的程序集时 - 它不会像其他引用一样被复制.似乎是因为文件名和程序集的Identity属性之间存在不匹配.
我有项目A和B,它们是项目C的依赖项.项目A需要引用MyAssembly.dll v.1.0,项目B需要引用MyAssembly.dll v.2.0,因此两者都需要能够位于Project C的bin /中发布文件夹.
怎么办?我怎样才能解决这个问题?
我想在ASP.NET Web应用程序内的专用网页上显示所有已使用程序集的列表,以便进行调试和维护(在许多不同的服务器上有许多此Web应用程序的实例).可以从bin文件夹或GAC调用程序集.我自己写了一些,但也有第三方集会.
是否有一种简单,自动的方式来获取Web应用程序的所有已加载或引用的程序集的列表,包括版本号(调用System.Reflection.Assembly- GetName().Version...)?我是否必须显式传递所有程序集名称以进行版本检查,还是可以自动检索它们?我是否必须使用Reflection来获取依赖项/引用的完整列表?
在加载到使用当前的AppDomain的组件Assembly.LoadFrom,我有以下代码:
[TypeConverter(typeof(EnumConverter<Shapes>))]
public enum Shapes
{
Triangle,
Square,
Circle
}
Run Code Online (Sandbox Code Playgroud)
通用EnumConverter <T>在通过调用Assembly.GetEntryAssembly()返回的程序集中定义.当我在运行时读取TypeConverter属性时,我得到的类型的全名如下所示:
MyAssembly.EnumConverter`1[[MyDynamicAssembly.Shapes, MyDynamicAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]
Run Code Online (Sandbox Code Playgroud)
但是,当我在字符串上调用Type.GetType()时,它返回null.我希望能够获得System.Type的实例.还要注意的是MyDynamicAssembly不是由Reflection.Emit的产生(在MSDN文章中指出在这里).
此代码是使用.NET Framework 2.0在Visual Studio 2005上生成的.
有没有人找到这个bug /限制的解决方法?它是否已在3.5中修复?
我一直在乱用.NET CLR集成在.NET代码中编写一些存储过程.在存储过程中,我正在调用第三方DLL.当我尝试在包含我的自定义存储过程的SQL Server中创建程序集时,它会抱怨第三方dll未在数据库中注册.
有没有办法在没有在SQL Server中注册的情况下调用dll?
如果两个程序集都定义namespace A包含class A1,则这两个类被视为唯一类型.
a)两个名称空间是否也被认为是唯一的?
b)如果program P有两个程序集的引用,我们如何创建这两种类型的实例?也就是说,当我尝试创建一个实例时,我不断收到错误A.A1
using A;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
A1 a = new A1(); // error
}
}
}
Run Code Online (Sandbox Code Playgroud)
c)但是如果program P还定义了type B.A1,那么当我声明一个实例时,编译器不会抱怨A1:
using A;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
A1 a = new A1(); // ok
}
}
class A1 { }
}
Run Code Online (Sandbox Code Playgroud)
不应该编译抱怨,因为它无法知道使用哪个版本A1(A.A1来自其中一个引用的程序集或B.A1)?
感谢名单
我有两个组件.一个组件指的是另一个组件.我检查了第一个程序集的清单,发现它引用了第二个程序集,并带有一些特定的令牌密钥.
但我检查了第二个程序集的标记,发现它有一个不同的公共标记.所以我错过了正确的第二次组装.所以我想知道有没有办法可以将第二个程序集的公共令牌更改为第一个程序集需要的那个.
另外我还有另一个第二个程序集,它具有public token = null.
我注意到Assembly.LoadFrom具有以下重载
public static Assembly Load(
byte[] rawAssembly
)
Run Code Online (Sandbox Code Playgroud)
如何将程序集另存为字节数组以便像这样创建它?
上下文:我想编写一个测试工具,以确保服务的后向兼容性.我想将客户端的固定版本加载到我的线束中,并从许多不同版本调用该服务.我认为将旧版本保存为byte []可以让我冻结它们.
目前,我有这个代码:
var shellViewLibrary = Assembly.LoadFrom(Path.Combine(_DllsPath, _DllShellView));
IEnumerable<Type> types = shellViewLibrary.GetTypes();
foreach (Type type in types)
{
var typeIShellViewInterface = type.GetInterface(_NamespaceIShellView, false);
if (typeIShellViewInterface != null)
{
//here
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,//here我想用它Activator.CreateInstance来创建一个类型type 在特定文件夹(在build文件夹之外)的对象,我尝试了大约20种不同的东西,其中大部分是这样的:http://msdn.microsoft .com/zh-cn/library/d133hta4.aspx
但没有效果......我尝试过的典型事情是:
object MyObj = Activator.CreateInstance(shellViewLibrary.FullName, type.FullName);
Run Code Online (Sandbox Code Playgroud)
要么
object MyObj = Activator.CreateInstance(Path.Combine(_DllsPath, _DllShellView), type.FullName);
Run Code Online (Sandbox Code Playgroud)
我总是有不同的例外,最常见的是:
XamlParseException
Run Code Online (Sandbox Code Playgroud)
我觉得我没有使用Activator.CreateInstance以正确的方式使用2个参数.我该怎么办 ?
我有一个写的代码CIL.比方说,一个名为的文件some_il_code.il保存它.我想编译它来创建一个托管exe程序集.
我如何实现这一目标?
我一直在互联网上寻找答案,并且可以真正使用帮助.
我已经查看了有关此错误的其他帖子,但这些答案都没有帮助我.
完整的错误是,
类型'xxx'在未引用的程序集中定义.您必须添加对程序集'xxx,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = null'的引用.
解决方案在本地构建良好,但是当我在构建服务器上触发构建时会发生错误.
这是我到目前为止试图解决这个问题的方法:
我正在使用VS2012和TFS2012来做到这一点.
我真的很感激任何帮助,谢谢.
*更新:*我刚刚在构建服务器上执行了一个MSBuild,但是将配置更改为"Release",并且能够重现部分错误.但是,一些关键的差异是它正在寻找的版本突然是1.3.1.15而不是0.0.0.0而PublicKeyToken不再是null.有谁知道这可能意味着什么?程序集的版本应该是0.0.0.0.
assemblies ×10
c# ×6
.net ×5
dll ×2
reflection ×2
asp.net ×1
cil ×1
clr ×1
generics ×1
integration ×1
namespaces ×1
reference ×1
sql ×1
tfs2012 ×1
tfsbuild ×1
version ×1