我一直在研究为Unity3D游戏添加mod支持.我是Unity的新手(但不是.NET),所以如果我觉得我遗漏了一些明显的东西,请告诉我,因为我可能是.
我希望能够直接从编辑器导出对象,包括自定义脚本.获取与脚本关联的程序集很容易.项目中任何松散的脚本似乎都被编译成Assembly- CSharp.dll.当我尝试在运行时在另一个Unity项目中加载程序集时,问题就出现了.调用Assembly.Load(byte[])返回当前项目的程序集,而不是字节数组表示的程序集.我假定这是因为AssemblyName从国防部项目的装配和主体项目的都是相同的(Assembly-CSharp,Version=0.0.0.0,Culture=neutral,PublicKeyToken=null).
作为测试,我更新了我的Visual Studio项目的mod项目,将它从Assembly-CSharp重命名为不同的东西.这会被Unity消灭,但我可以在此之前进行构建,并使用Assembly-CSharp以外的名称获取我正在寻找的程序集.加载此过程Assembly.Load(byte[])似乎可以通过一个非常简单的"导入脚本来旋转多维数据集"的方案来实现.虽然这似乎有效,但我真的在Unity编辑器中寻找更多自动魔术单步.
现在,关于这个问题 ......
如果我理解了这个问题,我正在寻找的是AssemblyName编译后更改程序集的编程方法.欢迎所有建议和意见.
我调查或考虑的一些可能路线:
1)一种神奇的API方法来更改AssemblyName和保存它.
这将是理想的,但我还没有发现任何有用的东西.
2)编辑程序集的原始字节以更改名称?不确定这是否可行,但是如果我可以安全可靠地覆盖程序集的一些原始字节来更改其名称,那就会膨胀.
3)创建一个包含原始程序集中类型的新动态程序集. 我对动态装配的经验有限.我可以创建一个,但我不确定如何做(如果可能)是原始程序集中定义的复制类型到新的动态程序集.
4)使用CSharpCodeProvider手动编译程序集.假设Unity支持它,那么我认为这可能会起作用,但似乎很痛苦.我还没有研究如何找到编译所需的所有脚本和引用.如果可能的话,我想避免它.
5)*一些魔术ilasm/ildasm.*假设有统一的等价物.这是否可以使用这些工具?
6)以编程方式更新csproj文件并重新编译.看起来非常hacky和痛苦.猜测我需要有代码来支持Visual Studio和MonoDevelop.
我宁愿避免使用外部工具和重新编译,因此前三个选项中的一个是理想选择.思想,想法?谢谢!
奖金问题:我的'导入脚本以旋转立方体'测试似乎有效,但是在加载程序集期间的日志中,我看到下面的两条消息.这不是我使用的程序集名称,不确定它来自何处.我应该担心吗?以后这会回来咬我吗?
> Non platform assembly: data-0B9D7940 (this message is harmless)
> Fallback handler could not load library C:/Dev/Test
> Projects/ModTest/Build/ModHost1/ModHost1_Data/Mono/data-0B9D7940.dll
Run Code Online (Sandbox Code Playgroud) 我试图了解Windows身份验证/加密如何与WCF中的NetTcpBinding一起使用.我需要确切地知道使用什么加密算法来加密通过线路传输的数据(以及一些证明它的文档).如果客户端和/或主机不在域上,Windows身份验证/加密是否仍然有效?
我喜欢使用以下格式创建xml:
XDocument xml = new XDocument(
new XElement("Root",
new XElement("A",
new XAttribute("X", xValue),
new XAttribute("Y", yValue)),
new XElement("B",
new XAttribute("Z", zValue)),
new XElement("C")));
Run Code Online (Sandbox Code Playgroud)
它似乎很容易阅读,有点像标签式XML文档(在我看来).StyleCop对格式化非常不满意.我收到很多这些错误:
SA1116:如果方法参数位于单独的行上,则第一个参数必须从方法名称下面的行开始.
SA1118:参数跨越多行.如果参数很短,请将整个参数放在一行上.否则,将参数的内容保存在临时变量中,并将临时变量作为参数传递.
我能做些什么来保持StyleCop的快乐和代码的可读性?我知道我可以禁用StyleCop规则,但团队希望为所有非XML创建代码保留这些规则.我可以选择性地抑制以这种方式创建XML的每个方法中的规则,但这看起来很痛苦并且变得丑陋.有什么建议?
我一直在寻找使用弱事件模式订阅事件.使用.NET 4.5框架,我们有一个漂亮的WeakEventManager类.弱订阅活动很简单
WeakEventManager<EventSource, SomeEventEventArgs>.AddHandler(source, "SomeEvent", source_SomeEvent);
Run Code Online (Sandbox Code Playgroud)
然而,我并不是'串式'代码的忠实粉丝.我一直试图找到一种方法来使用事件的字符串名称来订阅.我发现获取事件名称的唯一方法是在定义事件的类中使用lambda表达式.在我的场景中,我拥有定义事件的类,所以我可以随意改变它.我一直试图找到一种简洁的方式订阅和取消订阅我的活动,这是我最不喜欢的.
public event EventHandler<EventArgs> LoggingOn;
public event EventHandler<EventArgs> LoggingOn_Weak
{
add
{
var eventName = this.GetEventName(() => this.LoggingOn);
WeakEventManager<CurrentUser, EventArgs>.AddHandler(this, eventName, value);
}
remove
{
var eventName = this.GetEventName(() => this.LoggingOn);
WeakEventManager<CurrentUser, EventArgs>.RemoveHandler(this, eventName, value);
}
}
// In a base class view model in my scenario
private string GetEventName<T>(System.Linq.Expressions.Expression<Func<T>> expression)
{
return (expression.Body as System.Linq.Expressions.MemberExpression).Member.Name;
}
protected void OnLoggingOn(object sender, EventArgs e)
{
var handler = this.LoggingOn;
if (handler …Run Code Online (Sandbox Code Playgroud) 我想知道我是否可以安全地从多个线程中使用SelectNodes()和SelectSingleNode()从XmlDocument对象读取而没有任何问题.MSDN表示不保证它们是线程安全的.如果SelectNodes()和SelectSingleNode()确实存在从多个线程运行的问题,我可以使用正确的锁定来避免任何问题吗?我有一个WCF服务设置,需要从数据库中获取一大块xml并从这个xml中选择一些信息.我想缓存xml以避免频繁访问数据库,但我担心线程的安全性和性能.有没有更好的方法来做这个?谢谢
c# ×4
.net ×2
coding-style ×1
linq-to-xml ×1
reflection ×1
stylecop ×1
wcf ×1
weak-events ×1
xelement ×1