我制作了一个WPF/C#程序,我使用互联网控件进行所见即所得的HTML编辑.
它是一个常规的可执行程序.
它适用于大多数计算机,但有些计算机给我以下错误.
无法加载文件或程序集'Microsoft.mshtml,Version = 7.0.3300.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'或其依赖项之一.强名称验证失败.
"Microsoft.mshtml.dll"文件随程序一起分发.它与exe文件位于同一文件夹中的所有其他必需的dll.
这是输出 Fuslogvw
*** Assembly Binder Log Entry (1/14/2010 @ 6:36:51 PM) ***
The operation failed.
Bind result: hr = 0x80070002. The system cannot find the file specified.
Assembly manager loaded from: c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll
Running under executable C:\Documents and Settings\office\Desktop\Database\DATABASE.exe
--- A detailed error log follows.
=== Pre-bind state information ===
LOG: User = CAMPUSREMOTE\office
LOG: DisplayName = Microsoft.mshtml, Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
(Fully-specified)
LOG: Appbase = file:///C:/Documents and Settings/office/Desktop/Database/
LOG: Initial …Run Code Online (Sandbox Code Playgroud) 我在VS中的工具箱中添加了一个.ocx.创建了两个.dll:Interop.NNN.dll,AxInterop.NNN.dll.
每个人是什么?它们都是必需的吗?
我遇到的情况CloseHandle是,SEHException在调试器下运行时,PInvoke调用将在.NET 4应用程序中抛出.与其他遇到类似问题从3.5迁移到4的问题不同,我并没有特别担心这种行为,并且已经找到了问题(第三方库CloseHandle在同一个句柄上调用了两次).但是,我很困惑为什么在.NET 3.5应用程序中不会发生这种行为.
以下小但完整的示例演示了我遇到的行为(在XP SP3和Win 7 x64上测试,总是编译为x86):
class Program
{
static void Main(string[] args)
{
try
{
var hFileMapping = CreateFileMapping(new IntPtr(-1), IntPtr.Zero, 0x04 /* read write */, 0, 0x1000, null);
CloseHandle(hFileMapping);
CloseHandle(hFileMapping);
Console.WriteLine("No exception");
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
Console.ReadKey();
}
[DllImport("kernel32", SetLastError = true)]
static extern IntPtr CreateFileMapping(IntPtr hFile, IntPtr lpAttributes, int flProtect, int dwMaximumSizeHigh, int dwMaximumSizeLow, string lpName);
[DllImport("kernel32", SetLastError = true)]
static extern bool CloseHandle(IntPtr handle); …Run Code Online (Sandbox Code Playgroud) 我正在使用一个具有StringHandle字段的类,该字段IntPtr表示LPCWSTR在C++中的值
.
internal IntPtr StringHandle; // LPCWSTR
Run Code Online (Sandbox Code Playgroud)
现在说我有一个字符串: string x = "abcdefg"
如何使用String句柄指向String的开头,以便它像C++ LPCWSTR?
目前我使用PHP几乎所有我为Web开发的东西,但它的语言限制开始让我恼火.但是,当我开发一些实践并维护一些对我有帮助的PHP库时,我觉得我不准备只是切换到LISP丢弃我所有的PHP输出.在我可以访问的所有服务器上,它甚至可能是不可能的常规LAMP主机帐户.
我的问题是:LISP代码可以与PHP结合使用吗?是否有针对并行LISP/PHP的解决方案,用于互操作性的接口或perphaps只是针对另一个的实现?或者它是一个互相排斥的选择?
我想从非托管C++调用我的.NET代码.我的进程入口点是基于.NET的,所以我不必担心托管CLR.我知道可以使用.NET包装器来完成.NET对象,但是我想访问托管类的各个静态方法,因此COM不是我最短/最简单的路径.
谢谢!
在C#项目中,我们通过Add References设置添加对COM对象的引用,该设置指向COM对象,这导致IDE自动生成interop程序集.所以这很好,但我们正在构建基于.net 3.5 SP1又称CLR 2.0,并且生成的互操作使用4.0 CLR使它们不兼容.有办法防止这种情况吗?
我假设另一个选项是配置我们的构建脚本尝试使用带有/ references参数的tlbimp.exe吗?指向mscorlib v2.0?
无论如何,我希望有一个标志允许这个.
我搜索了这些SO结果,找不到与我的问题有关的任何内容.我怀疑这可能是重复的.
我目前正在.NET C#3.5中编写一个Microsoft.Office.Interop.Excel PIA包装器,并且想知道在调用打开给定工作簿等方法时最好使用什么.
System.Type.Missing还是Missing.Value?
我已经执行了一些Google搜索,但找不到任何区别,除了一个来自System命名空间(System.Type.Missing),另一个(Missing.Value)来自System.Reflection命名空间.
当你想将参数的默认值传递给互操作程序集时,似乎都使用了这两个...
谢谢你的回答!=)
当一个COM对象在STA线程上实例化时,该线程通常必须实现一个消息泵,以便为来回调用其他线程(见这里).
可以手动泵送消息,或者依赖于某些(但不是全部)线程阻塞操作在等待时自动泵送COM相关消息的事实.文档通常无助于决定哪个是哪个(参见相关问题).
如何确定线程阻塞操作是否会在STA上泵送COM消息?
到目前为止的部分清单:
阻断其业务做泵*:
Thread.JoinWaitHandle.WaitOne/ WaitAny/WaitAll(WaitAll不能从一个STA线程虽然称为)GC.WaitForPendingFinalizersMonitor.Enter(因此lock) - 在某些条件下ReaderWriterLock阻止不泵送的操作:
Thread.SleepConsole.ReadKey (在某处读)*注意Noseratio的答案说,即使是操作泵,也是为非常有限的未公开的COM特定消息集.
我喜欢使用nullptr而不是NULL.现在我调用一个C函数(libjansson在本例中).
NULL在C中是实现定义的.
因为nullptr我发现"空指针常量是整数类型的整数常量表达式(5.19)rvalue,其值为零".
所以最安全的事情是:
auto string_obj=json_object_get(m_handle,name);
if(string_obj!=NULL)
{
auto string=json_string_value(string_obj);
if(string!=NULL)
{return string;}
}
return nullptr;
Run Code Online (Sandbox Code Playgroud)
我真的需要它还是可以更简单地做到这一点:
auto string_obj=json_object_get(m_handle,name);
if(string_obj!=nullptr)
{
return json_string_value(string_obj); //Assume there is no difference between C NULL and C++11 nullptr
}
return nullptr;
Run Code Online (Sandbox Code Playgroud)